我在 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/