Из книги Agile Web Development with Rails
class Order < ActiveRecord::Base
named_scope :last_n_days, lambda { |days| {:conditions =>
['updated < ?' , days] } }
named_scope :checks, :conditions => {:pay_type => :check}
end
Заявление
orders = Orders.checks.last_n_days(7)
приведет только к одному запросу к базе данных.
Как рельсы это реализуют? Я новичок в Ruby, и мне интересно, есть ли специальная конструкция, которая позволяет этому происходить.
Чтобы иметь возможность связывать такие методы, функции, сгенерированные named_scope, должны возвращать себя или объект, область действия которого может быть расширена. Но как Ruby узнает, что это последний вызов функции и что сейчас нужно запросить базу данных?
Я спрашиваю об этом, потому что приведенный выше оператор фактически запрашивает базу данных, а не просто возвращает оператор SQL, полученный в результате цепочки.