ActiveRecord reprezentuje literę M (Model) w architekturze Rails MVC, hermetyzując logikę biznesową, zapytania do bazy danych, powiązania i walidacje.
Metody zapytań
# Podstawowe metody wyszukiwania
User.find(1) # Rzuca RecordNotFound, jeśli nie odnaleziono
User.find_by(email: '[email protected]')# Zwraca nil, jeśli nie odnaleziono
User.first
User.last
# Warunki i filtry
User.where(active: true)
User.where.not(role: 'banned')
User.where('age >= ?', 18)
# Sortowanie i stronicowanie
User.order(created_at: :desc).limit(10).offset(20)
# Zakresy (Scopes)
class User < ApplicationRecord
scope :active, -> { where(active: true) }
scope :recent, -> { order(created_at: :desc) }
end
Powiązania (Associations)
class Author < ApplicationRecord
has_many :books, dependent: :destroy
has_one :profile
has_many :reviews, through: :books
end
class Book < ApplicationRecord
belongs_to :author
has_and_belongs_to_many :genres
end
Walidacje (Validations)
class User < ApplicationRecord
validates :name, presence: true, length: { minimum: 2 }
validates :email, presence: true, uniqueness: { case_sensitive: false }, format: { with: URI::MailTo::EMAIL_REGEXP }
validates :age, numericality: { greater_than_or_equal_to: 13 }
validates :role, inclusion: { in: %w[admin member guest] }
end
Callbacki
class Order < ApplicationRecord
before_validation :normalize_currency
before_create :generate_tracking_code
after_create_commit :send_receipt_email
private
def normalize_currency
self.currency = currency.upcase
end
end
Śledzenie zmian (Dirty Tracking)
user = User.first
user.name = "New Name"
user.changed? # => true
user.changed # => ["name"]
user.changes # => {"name" => ["Old Name", "New Name"]}
user.name_was # => "Old Name"
Agregacje i obliczenia
Order.count
Order.sum(:total_amount)
Order.average(:rating)
Order.maximum(:price)
Order.minimum(:price)