ruby-on-rails - 示波器的真正好处是什么

标签 ruby-on-rails activerecord scope

我查看了 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/

相关文章:

ruby-on-rails - 如何创建两个对象属于同一个父对象的工厂?

php - CodeIgniter 将数据插入数据库并在字符串中添加引号

ruby-on-rails - 如何按距离以外的方式对Rails Geocoder gem的结果进行排序

c - 弹性 Action 在什么范围内执行?

c - Ruby 中没有操作范围?

ruby-on-rails - 如何在 Ruby on Rails 中实现 Active Record 继承?

ruby-on-rails - 用户的未定义方法 'suspend_paypal'

ruby-on-rails - rails : Opening a file using an incomplete file name

mysql - 从 db : how to consider only date in datetime field? 中检索数据

service - 使用原型(prototype)作用域时出现 Symfony2 ScopeCrossingInjectionException