2011-09-22 11 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 = ? 

として解釈されているよりも高い優先順位を持っているか - しかし、この場合に、より関連性 - 彼らはまた、両方ともが左-連想されています。 (私も等価演算子を固定する自由を取ったが、代替構文のための他の回答を参照および/または近づく。。)

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

ハッピーコーディング:

簡単な修正は、このようになります。今後の参考のために

1

あなたはそうあなたが

User.all(:conditions => ["company_id = ? AND role_id IN (?,?,?)", X, 1,2,3 ]) 
3

はカップルの事だろうと言うことができるしかしhttps://github.com/binarylogic/searchlogic

を調査することをお勧めします。

最初に使用する単一値は=です。==:conditions => "..."になりません。

第2に、"...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(',')})") 
関連する問題