0

named_scope 或 scope 与类方法有何区别。

named_scope :active, :conditions => {:status => 'Active'}

def self.active
  self.find(:all, :conditions => {:status => 'Active'}
end

两者有什么区别?

4

2 回答 2

4

最后,“范围”将在您的模型上定义一个可链接的类方法。这就是为什么每个返回“范围”(ActiveRecord::Relation 类的对象)的类方法都可以以与定义的范围/命名范围相同的方式使用。

如果您想了解有关范围的更多信息,我建议您使用 rails 控制台来玩一些输出,或者 - 也许作为开始 - 阅读 rails 指南 - 他们几乎解释了它:http://guides.rubyonrails。 org/active_record_querying.html#scopes

编辑:

哦,当然,阅读 Rails 代码通常可以更快地解决问题,然后是任何人或其他任何事情。如果您在此处查看“范围”方法的定义:https ://github.com/rails/rails/blob/master/activerecord/lib/active_record/scoping/named.rb#L159您将看到它是如何定义的一个方法(在类级别) - 这与您自己定义方法非常相似,如您的示例中所示。

于 2012-08-05T12:28:33.590 回答
2

最大的区别是可链接性。假设您有另一个命名范围,流行:

named_scope :popular, :conditions => { :popular => true }

假设您想获得受欢迎的活跃用户。所以你说User.popular.active

named_scope :active, :conditions => {:status => 'Active'}

在这种情况下,然后User.popular.active工作。

另一方面,

def self.active
  self.find(:all, :conditions => {:status => 'Active'}
end

可能允许您说User.active.popular(取决于您的 Rails 版本,IIRC),但绝对不是 User.popular.active.

非正式地,该scope方法安排它定义的方法在对象的其他范围内可用。定义一个类方法没有。

于 2012-08-05T14:29:04.953 回答