named_scope和方法有什么区别?

named_scope或scope与class方法有何不同。

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

这两者有什么区别?

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

如果你想找到关于范围的更多信息,我建议使用rails控制台来播放输出,或者 – 也许作为开始 – 阅读rails指南 – 他们几乎可以解释它: http://guides.rubyonrails。组织/ active_record_querying.html#范围

编辑:

哦,当然读入rails代码通常可以更快地清理事物,然后是任何人或其他任何东西。 如果你看一下’范围’方法的定义: https : //github.com/rails/rails/blob/master/activerecord/lib/active_record/scoping/named.rb#L159你会看到,它是如何定义的一个方法(在类级别) – 这与自己定义方法非常相似,如在您的示例中。

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

 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方法安排它定义的方法在对象的其他范围内可用。 定义类方法不会。