2013-05-30 46 views
2

我曾經遇到過在活動記錄某些異常行爲(3.2.13):ActiveRecord在應用範圍時的條件合併當前?

上有我的模型一個簡單的範圍:

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

這可以在單獨使用罰款:

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

當我串聯where -clauses,他們是and ED預期:

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" 

問題:

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

如何在應用範圍:

然而,當我鏈接一個範圍,我的第一個WHERE子句是核爆,最後一個在合併勝與現有條件的關係?

(這些現有條件下已經通過康康舞的load_and_authorize_resource成立,所以我不能只是應用這些where條款之後將我的討論範圍)。

+0

「nuking」似乎發生在'merge':http://apidock.com/rails/ActiveRecord/SpawnMethods/merge ...這似乎在使用'scope'時應用:http:// apidock。 com/rails/ActiveRecord/Scoping/Named/ClassMethods/scope – crispy

回答

1

將其更改爲

User.verified.where(company_id: 1).where(company_id: 2).to_sql 

看來,當你在where子句之後使用scope,它只是創建鏈接的where子句的新哈希,然後在末尾進行AND操作。

因此

User.where(company_id: 1).where(company_id: 2).verified.to_sql 

給你

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

User.where(company_id: 1).where(contact_id: 2).verified.to_sql 

給你

"SELECT \"users\".* FROM \"users\" WHERE \"users\".\"company_id\" = 2 AND 
\"users\".\"contact_id\" = 2 AND (verified = 1)" 
+0

在我的情況下並不那麼容易。在我的Controller中:'load_and_authorize_resource通過::company'。 cancan在這裏引入了兩個where子句:第一個使用params [:company],第二個使用能力規則('can:read,User,company_id:@ user.company_ids')。在那之後,我在我的控制器中加載並授權了'@ users'變量,並希望應用我的範圍。 – crispy