Ruby on rails Ruby on Rails ActiveRecord作用域与类方法

Ruby on rails Ruby on Rails ActiveRecord作用域与类方法,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,Rails在内部将作用域转换为类方法,那么为什么我们不能使用类方法本身而不是作用域呢 14个范围 […] 为了定义一个简单的作用域,我们在类中使用scope方法,传递调用此作用域时要运行的查询: class Article < ActiveRecord::Base scope :published, -> { where(published: true) } end 因此,无参数范围在视觉上是“干净”和简洁的,但添加lambda来处理参数会使其看起来更混乱: scope :pa

Rails在内部将作用域转换为类方法,那么为什么我们不能使用类方法本身而不是作用域呢

14个范围
[…]
为了定义一个简单的作用域,我们在类中使用
scope
方法,传递调用此作用域时要运行的查询:

class Article < ActiveRecord::Base
  scope :published, -> { where(published: true) }
end
因此,无参数范围在视觉上是“干净”和简洁的,但添加lambda来处理参数会使其看起来更混乱:

scope :pancakes, ->(x) { where(things: x) }
但是Rails4想要lambdas,即使是对于无参数的作用域,这种区别现在就更没有意义了

我怀疑这种差异在这一点上是历史性的。在以前,作用域可能是一些特殊的东西,但在Rails3时代,它变成了普通的旧类方法,以减少重复,并更好地与Rails3附带的新查询接口相匹配



因此,如果愿意,您可以跳过
范围
,直接转到类方法。当作用域接受参数时,甚至鼓励您这样做。

作用域
只是
类方法。
内部活动记录将作用域转换为类方法

“它们之间没有区别”或“这是品味的问题”。我倾向于同意这两个句子,但我想说明两个句子之间存在的一些细微差异。
这很好地解释了两者之间的差异。

对我来说是最好的,它很容易解释

中关于这个主题的有趣文章和讨论
scope :published, where(published: true)
scope :pancakes, ->(x) { where(things: x) }