我有這個疑問,但它沒有給我預期的結果: 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。
我有這個疑問,但它沒有給我預期的結果: 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。
它不工作,因爲優先順序是錯誤的。也就是說,
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 = ?)
(但是看其他答案的替代語法和/或接近我還拿了固定平等運營商的自由。)
快樂編碼。
你可能想調查https://github.com/binarylogic/searchlogic
但是,否則你可能會說
User.all(:conditions => ["company_id = ? AND role_id IN (?,?,?)", X, 1,2,3 ])
可能是一對夫婦的事情。
首次使用單個等於=
,不等於==
在:conditions => "..."
。
其次,您可以使用"...AND role_id IN (?,?,?)", X, 1, 2, 3])
,或者您需要將role_id
與括號進行比較,因此它將是condition AND (condition OR condition OR condition)
。
以供將來參考,這對我幫助很大緩和這種認定的,你可以這樣做:
company_id = "X"
role_ids = [1,2,3]
User.find(:all, :conditions => "company_id=#{company_id} AND role_id IN (#{role_ids.join(',')})")