2011-09-22 18 views
2

我有這個疑問,但它沒有給我預期的結果: User.all(:conditions => ["company_id == ? AND role_id == ? OR role_id == ? OR role_id == ?", X, 1,2,3 ])爲什麼使用AND和OR運算符的查詢會產生意想不到的結果?

這應該是指:獲得所有與X COMPANY_ID用戶和他們的角色可以是1或2或3

所以它可以是這些角色中的任何一個,但所有這些用戶必須來自該company_id。

回答

5

它不工作,因爲優先順序是錯誤的。也就是說,

company_id = ? AND role_id = ? OR role_id = ? OR role_id = ? 

被解釋爲

((company_id = ? AND role_id = ?) OR role_id = ?) OR role_id = ? 

因爲AND優先級高於OR - 但更切合這種情況下 - 他們也都是向左結合的。

的簡單的修復,從而是:

company_id = ? AND (role_id = ? OR role_id = ? OR role_id = ?) 

(但是看其他答案的替代語法和/或接近我還拿了固定平等運營商的自由。)

快樂編碼。

3

可能是一對夫婦的事情。

首次使用單個等於=,不等於==:conditions => "..."

其次,您可以使用"...AND role_id IN (?,?,?)", X, 1, 2, 3]),或者您需要將role_id與括號進行比較,因此它將是condition AND (condition OR condition OR condition)

0

以供將來參考,這對我幫助很大緩和這種認定的,你可以這樣做:

company_id = "X" 
role_ids = [1,2,3] 
User.find(:all, :conditions => "company_id=#{company_id} AND role_id IN (#{role_ids.join(',')})") 
相關問題