namedscope和method有什么区别



named_scope或scope与class方法的区别。

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

这两者有什么区别?

最终,"scope"将在模型上定义一个可链接的类方法。这就是为什么每个返回"scope"(这是类ActiveRecord::Relation的对象)的类方法都可以以定义的scope/named_scope相同的方式使用。

如果你想找到更多关于作用域的信息,我建议你使用rails控制台来玩一玩输出,或者——也许作为一个开始——阅读rails指南——它们几乎解释了这一点:http://guides.rubyonrails.org/active_record_querying.html#scopes

编辑:

哦,当然,阅读rails代码通常可以比任何人或任何其他人更快地解决问题。如果您在此处查看"scope"方法的定义: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方法安排它定义的方法在对象的其他作用域上可用。定义类方法则不然。

最新更新