范围的真正好处是什么?

Mar*_*ark 10 activerecord scope ruby-on-rails

我查看了超过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
Run Code Online (Sandbox Code Playgroud)

文档一遍又一遍地说,范围是有益的,因为它们可以被链接......

"所有范围方法都将返回一个ActiveRecord :: Relation对象,该对象将允许在其上调用更多方法(例如其他范围)." - guides.rubyonrails.org

"范围比普通类方法更好的主要原因是它们可以与其他方法链接" http://ruby.railstutorial.org

......但上面的替代方案也可以链接产生相同的结果.

试图弄清楚皇帝的新衣服是否会在这里发生.即使从句法角度来看,似乎也没有任何好处.它们是否更快 - 一些消息来源含糊地暗示这一点.

mgu*_*mon 3

正如已经指出的,ActiveRecord 作用域实际上只是封装在最佳实践中的语法糖。

在 Rails 的 2.x 时代,当它们被称为“named_scope”时,它们变得更加重要。它们允许轻松链接条件来生成查询。正如您所指出的,随着 Rails 3.x 中 Arel 的改进,创建查询关系的函数变得很简单。范围只是为可链接的预定义查询提供了简单而优雅的解决方案。将所有范围放在模型的顶部可以提高可读性并有助于显示模型的使用方式。

  • 对于 Rails,使用更好的语法很重要。不是针对第 1 天(甚至第 100 天)的代码库,而是针对第 1000 天的代码库。 (2认同)