ruby-on-rails - ActiveRecord 在应用范围时合并当前的 where 条件?

标签 ruby-on-rails activerecord arel scopes

我在 Active Record (3.2.13) 中遇到了一些意外行为:

我的模型上有一个简单的范围:

class User < ActiveRecord::Base
  scope :verified, lambda { where('verified = 1') }
end

这可以单独使用:

  User.verified.to_sql
  #=> "SELECT \"users\".* FROM \"users\"  WHERE (verified = 1)"

当我连接 where 子句时,它们按预期进行 and 编辑:

  User.where(company_id: 1).where(company_id: 2).to_sql
  "SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"company_id\" = 1 AND \"users\".\"company_id\" = 2"

问题:

但是,当我链接作用域时,我的第一个 where 子句被破坏,最后一个子句在合并中获胜:

User.where(company_id: 1).where(company_id: 2).verified.to_sql
"SELECT \"users\".* FROM \"users\"  WHERE \"users\".\"company_id\" = 2 AND (verified = 1)"

如何在现有条件的关系上应用范围?

(这些现有条件是通过 cancan 的 load_and_authorize_resource 建立的,因此我不能仅在应用我的范围之后应用那些 where 子句。) p>

最佳答案

这个要点总结了我们对此问题的发现。 https://gist.github.com/kirel/5678865

它归结为 ActiveRecord::Scoping::Named::ClassMethods#scope 使用 ActiveRecord::SpawnMethods#merge 实现了意想不到的但预期 行为。

Rails 4 不会使用合并,因此会按预期运行(请参阅 https://github.com/rails/rails/commit/cd26b6ae7c1546ef8f38302661bbedf8cb487311 )。同时,解决方法是避免作用域并使用类方法。

关于ruby-on-rails - ActiveRecord 在应用范围时合并当前的 where 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16832882/

相关文章:

ruby-on-rails - 如何构建用于查询 Redshift 数据库的前端(希望使用 Rails)

ruby-on-rails - 如何将此原始查询转换为事件记录查询接口(interface)或 arel?

ruby-on-rails - 如何使用 Arel 批量插入?

ruby-on-rails - Rails 将具有浮点值的字符串转换为整数

ruby - AWS lambda : Could not load 'active_record/connection_adapters/postgresql_adapter'

ruby-on-rails - 从 ActiveRecord/Rails 查询中检索单个记录

ruby-on-rails - 名称错误 : undefined local variable or method `params' for main:Object

ruby-on-rails - rails : Subclass not registering as instance of parent class

jquery - 用于用户帖子的 Rails ajax fav 按钮