named_scope和方法有什么区别?

时间:2012-08-05 11:50:25

标签: ruby-on-rails ruby named-scope ruby-on-rails-2

named_scope或scope与class方法的区别如何。

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

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

这两者之间有什么区别?

2 个答案:

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