activerecord - 在 Rails 4 中,Model.scoped 已被弃用,但 Model.all 无法替代它

标签 activerecord ruby-on-rails-4

从 Rails 4 开始,Model.scoped 现已弃用。

弃用警告:Model.scoped 已弃用。请改用 Model.all。

但是,Model.scopedModel.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/

相关文章:

ruby-on-rails - 如何转换事件记录模型验证

php - 使用 where、like 和 or_like CodeIgniter 3 Active Records 进行多重连接

ruby-on-rails-4 - 为什么我得到未定义的方法 each_key?

ruby-on-rails - Rspec/capybara - 测试一个类或另一个类的存在

javascript - Rails 4 应用程序一页上的多个 Stripe 支付按钮

ruby-on-rails - 更快的保存方法?

ruby-on-rails - 使用 rails 从一种形式保存到多个模型

ruby-on-rails - 如何在Rails的表格中计算唯一值?

ruby-on-rails - 测试 View 编辑表单时 Rspec 失败

ruby-on-rails - NoMethodError in Pages#home undefined method `environment' for nil :NilClass