named_scope或scope与class方法的区别如何。
named_scope :active, :conditions => {:status => 'Active'}
def self.active
self.find(:all, :conditions => {:status => 'Active'}
end
这两者之间有什么区别?
答案 0 :(得分:4)
最后,“范围”将在您的模型上定义可链接的类方法。这就是为什么返回'scope'(它是ActiveRecord :: Relation类的一个对象)的每个类方法都可以像定义的scope / named_scope一样使用。
如果你想了解更多有关示波器的内容,我建议使用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你会看到它是如何定义一个方法(在类级别上) - 这与你自己定义方法非常相似,如你的例子所示。 / p>
答案 1 :(得分: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
(取决于您的导轨版本,IIRC),但绝对不 User.popular.active
。
非正式地,scope
方法安排它定义的方法在对象的其他范围内可用。定义类方法不会。