Общая идея состоит в том, чтобы придерживаться максимально генерируемых запросов ActiveRecord
и использовать фрагменты SQL только при необходимости . Фрагменты SQL явно поддерживаются, потому что создатели ActiveRecord
поняли, что SQL нельзя полностью абстрагировать.
Использование метода find
без фрагментов SQL, как правило, вознаграждается за лучшую поддержку. Учитывая ваш пример, попробуйте:
Book.find(:all,
:conditions => ["created_at >= ? AND created_at <= ? AND updated_at <= ?",
date1, date2, date3]
:include => :carts)
:inlude => :carts
выполнит объединение, если вы добавили has_many :carts
к вашей Book
модели. Как вы можете видеть, нет необходимости в большом количестве SQL. Даже цитирование и экранирование ввода могут быть оставлены на Rails, при этом все еще используются литералы SQL для обработки операторов >=
и <=
.
Пройдя немного дальше, вы можете сделать это еще яснее:
class Book < AciveRecord::Base
# Somewhere in your Book model:
named_scope :created_between, lambda { |start_date, end_date|
{ :conditions => { :created_at => start_date..end_date } }
}
named_scope :updated_before, lambda { |date|
{ :conditions => ["updated_at <= ?", date] }
}
# ...
end
Book.created_between(date1, date2).updated_before(date3).find(:all,
:include => :carts)
Обновление: точка named_scope
s, конечно, повторно использовать условия. Вам решать, имеет ли смысл помещать набор условий в именованную область или нет.