ORM (Object-Relational Mapping) — это технология, которая связывает реляционные базы данных с объектно-ориентированными языками программирования. В Ruby наиболее популярными ORM являются ActiveRecord (часть Rails) и Sequel.
# ActiveRecord пример
class User < ActiveRecord::Base
end
# Таблица users автоматически связывается с классом User
user = User.find(1) # Находит запись с id=1
# Create
new_user = User.create(name: 'Alex', email: 'alex@example.com')
# Read
user = User.find_by(email: 'alex@example.com')
# Update
user.update(name: 'Alexander')
# Delete
user.destroy
# Без ORM
conn.exec_params('SELECT * FROM users WHERE id = $1', [1])
# С ORM
User.find(1)
class User < ActiveRecord::Base
has_many :posts
has_one :profile
belongs_to :company
end
user.posts.each { |post| puts post.title }
class User < ActiveRecord::Base
validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
validates :age, numericality: { greater_than: 18 }
end
user = User.new
user.valid? # => false
user.errors.full_messages # => ["Email can't be blank", "Age must be greater than 18"]
require 'sequel'
DB = Sequel.connect('postgres://user:password@localhost/dbname')
class User < Sequel::Model
plugin :validation_helpers
def validate
super
validates_presence [:name, :email]
end
end
User.where(age: 18..30).exclude(active: false).order(:name).limit(10)
class CreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
t.string :name
t.string :email
t.integer :age
t.timestamps
end
add_index :users, :email, unique: true
end
end
# Плохо: выполняется N+1 запрос
User.all.each do |user|
puts user.posts.count
end
# Хорошо: выполняется 2 запроса
User.includes(:posts).each do |user|
puts user.posts.size # Использует предзагруженные данные
end
Характеристика | ActiveRecord | Sequel |
---|---|---|
Производительность | Средняя | Высокая |
Синтаксис | Более читаемый | Более гибкий |
Сложные запросы | Ограниченные | Мощные |
Интеграция с Rails | Нативная | Требует настройки |
Документация | Отличная | Хорошая |
ActiveRecord::Base.connection.execute(<<```SQL)
EXPLAIN ANALYZE
SELECT * FROM large_table
WHERE complex_condition = true
SQL
Используйте scope для часто используемых запросов
class Article < ActiveRecord::Base
scope :published, -> { where(published: true) }
scope :recent, -> { order(created_at: :desc) }
end
Избегайте бизнес-логики в моделях
Оптимизируйте запросы (includes, select, limit)
Тестируйте миграции перед применением в production
ORM в Ruby предоставляет мощные инструменты для работы с БД:
Правильное использование ORM позволяет: