我查看了 10 多页,试图找到作用域比任何其他返回 ActiveRecord::Relation 的 ActiveRecord 类方法的优势。
在下面的例子中,为什么范围比它下面的替代品更好,它们做同样的事情:
#scope :pat1, lambda {{:conditions => ["name like ?", 'J%']}}
#scope :pat2, lambda {{:conditions => ["id > 5"]}}
def self.pat1
where("name like ?", 'J%')
end
def self.pat2
where("id > 5")
end
def patx
self.class.pat1.pat2.first
end
文档一遍又一遍地说范围是有益的,因为它们可以链接......
“所有范围方法都将返回一个 ActiveRecord::Relation 对象,该对象将允许在其上调用更多方法(例如其他范围)。”
- guides.rubyonrails.org
“范围比普通类方法更好的主要原因是它们可以与其他方法链接”
http://ruby.railstutorial.org
...但上面的替代方案也可以链接产生相同的结果。
只是想弄清楚这里是否有皇帝的新装事情。即使从句法的角度来看,似乎也没有任何好处。它们是否更快 - 一些消息来源含糊地暗示了这一点。
最佳答案
如前所述,ActiveRecord 作用域实际上只是封装在最佳实践中的语法糖。
在 Rails 的 2.x 时代,当它们被称为“named_scope”时,它们更重要一点。它们允许轻松链接条件以生成查询。正如您所指出的,随着 Rails 3.x 与 Arel 的改进,为查询关系创建函数变得很简单。 Scopes 只是为可链接的预定义查询提供了一个简单而优雅的解决方案。将所有范围放在模型顶部可提高可读性并有助于显示模型的使用方式。
关于ruby-on-rails - 示波器的真正好处是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9728623/