来自《使用Rails进行敏捷Web开发》一书
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)
这将导致只有一个查询到数据库的结果。
Rails是如何实现这个功能的呢?我对Ruby还不熟悉,想知道是否有特殊的结构可以实现这个功能。
为了能够像这样链式调用方法,named_scope生成的函数必须返回自身或者可以进一步进行作用域限定的对象。但是,Ruby如何知道它是最后一个函数调用,并且现在应该查询数据库呢?
我之所以问这个问题,是因为上面的语句实际上会查询数据库,而不仅仅是返回由链式调用产生的SQL语句。