我正在处理的项目中有一个named_scope,如下所示:
# default product scope only lists available and non-deleted products
::Product.named_scope :active, lambda { |*args|
Product.not_deleted.available(args.first).scope(:find)
}
初始的named_scope是有道理的。这里令人困惑的部分是.scope(:find)如何工作。这显然是调用另一个命名范围(not_deleted),然后应用.scope(:find)。什么/如何.scope(:find)在这里工作?
答案 0 :(得分:5)
快速回答
Product.not_deleted.available(args.first)
是一个命名范围本身,由两个命名范围组合而成。
scope(:find)
获取命名范围(或范围组合)的条件,您可以使用这些条件创建新的命名范围。
所以举个例子:
named_scope :active, :conditions => 'active = true'
named_scope :not_deleted, :conditions => 'deleted = false'
然后你写
named_scope :active_and_not_deleted, :conditions => 'active = true and deleted = false'
或者,你可以写
named_scope :active_and_not_deleted, lambda { self.active.not_deleted.scope(:find) }
是完全相同的。我希望这说清楚。
请注意,这在rails 3中变得更简单(更干净),您只需编写
scope :active_and_not_deleted, active.not_deleted
答案 1 :(得分:2)
Scope是ActiveRecord :: Base上的一个方法,它返回传入方法的当前范围(如果此时要运行它,实际上将用于构建查询)。
# Retrieve the scope for the given method and optional key.
def scope(method, key = nil) #:nodoc:
if current_scoped_methods && (scope = current_scoped_methods[method])
key ? scope[key] : scope
end
end
因此,在您的示例中,lambda在合并所有其他命名范围后返回Product.find
调用的范围。
我有一个named_scope:
named_scope :active, {:conditions => {:active => true}}
在我的控制台输出中,Object.active.scope(:find)
返回:
{:conditions => {:active => true}}