Rails 2.3.x-此ActiveRecord范围如何工作?

ran*_*its 4 activerecord ruby-on-rails

我正在处理的项目中有一个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)
  }
Run Code Online (Sandbox Code Playgroud)

最初的named_scope很有意义。这里令人困惑的部分是.scope(:find)的工作方式。显然,这将调用另一个命名范围(未删除),然后再应用.scope(:find)。.scope(:find)在这里做什么/如何工作?

nat*_*vda 5

快速解答

Product.not_deleted.available(args.first)
Run Code Online (Sandbox Code Playgroud)

是一个本身由两个命名范围合并而成的命名范围。

scope(:find) 获取命名范围(或范围的组合)的条件,您可以依次使用这些条件来创建新的命名范围。

因此,通过示例:

named_scope :active,      :conditions => 'active  = true' 
named_scope :not_deleted, :conditions => 'deleted = false'
Run Code Online (Sandbox Code Playgroud)

然后你写

named_scope :active_and_not_deleted, :conditions => 'active = true and deleted = false'
Run Code Online (Sandbox Code Playgroud)

或者,你可以写

named_scope :active_and_not_deleted, lambda { self.active.not_deleted.scope(:find) }
Run Code Online (Sandbox Code Playgroud)

这是相同的。我希望这一点很清楚。

注意,这在rails 3中变得更简单(更干净),您只需编写

scope :active_and_not_deleted, active.not_deleted
Run Code Online (Sandbox Code Playgroud)