我们default_scope
的 User 类有一个将用户限制为一组公司:
class User < ActiveRecord::Base
default_scope do
c_ids = Authorization.current_company_ids
includes(:companies).where(companies: { id: c_ids })
end
has_many :company_users
has_many :companies, through: company_users
end
class CompanyUser < ActiveRecord::Base
belongs_to :user
belongs_to :company
validates_uniqueness_of :company_id, scope: :user_id
end
class Company < ActiveRecord::Base
has_many :company_users
has_many :users, through: company_users
end
按预期调用User.last
或User.find_by_email('mhayes@widgetworks.com')
或User.find(55557)
所有工作和范围。
调用User.exists?(id)
会引发一个奇怪的错误:
Mysql2::Error: Unknown column 'companies.id' in 'where clause': SELECT 1 AS one FROM `users` WHERE `companies`.`id` IN (4) AND `users`.`id` = 55557 LIMIT 1
基本上,如果我得到这个,那就是说这companies
不是一个专栏User
,它是。如果我什至将 sql 复制到一个where
语句中,它的计算结果是正确的。
User.where("SELECT 1 AS one FROM `users` WHERE `companies`.`id` IN (4) AND `users`.`id` = 66668 LIMIT 1")
这让我觉得有一个评估顺序,default_scope
并且exists?
以某种方式调用 before default_scope
。
如果我打电话:
User.includes(:companies).where(companies: { id: [4] }).exists?(55557)
作品。这就是default_scope
正在做的事情,所以我知道default_scope
范围没有失败。