从 Rails 4 开始,Model.scoped
现已弃用。
弃用警告:Model.scoped 已弃用。请改用 Model.all。
但是,Model.scoped
和 Model.all
有一个区别,即 scoped.scoped
返回一个作用域,而 all.all
运行查询。
On Rails 3:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
On Rails 4:
> Model.all.all.is_a?(ActiveRecord::Relation)
DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. `Post.where(published: true).load`). If you want to get an array of records from a relation, you can call #to_a (e.g. `Post.where(published: true).to_a`).
=> false
当有条件做某事或什么都不做时,库/关注点中的某些用例会返回范围
,如下所示:
module AmongConcern
extend ActiveSupport::Concern
module ClassMethods
def among(ids)
return scoped if ids.blank?
where(id: ids)
end
end
end
如果您将此 scoped
更改为 all
,您将面临随机问题,具体取决于 among
在作用域链中的使用位置。例如,Model.where(some: value).among(ids)
将运行查询而不是返回范围。
我想要的是 ActiveRecord::Relation
上的幂等方法,它只返回一个范围。
我应该在这里做什么?
最佳答案
看起来 where(nil)
是 scoped
的真正替代品,它可以在 Rails 3 和 4 上运行。:(
关于activerecord - 在 Rails 4 中,Model.scoped 已被弃用,但 Model.all 无法替代它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18198963/