为什么使用AND和OR运算符进行查询会产生意外结果?

leo*_*nel 2 ruby activerecord ruby-on-rails

我有这个查询,但它没有给我预期的结果: User.all(:conditions => ["company_id == ? AND role_id == ? OR role_id == ? OR role_id == ?", X, 1,2,3 ])

它应该意味着:使用X company_id获取所有用户,并且他们的角色可以是1或2或3.

所以它可以是这些角色中的任何一个,但所有这些用户都必须来自THAT company_id.

小智 5

它不起作用,因为优先级是错误的.那是,

company_id = ? AND role_id = ? OR role_id = ? OR role_id = ?
Run Code Online (Sandbox Code Playgroud)

被解释为

((company_id = ? AND role_id = ?) OR role_id = ?) OR role_id = ?
Run Code Online (Sandbox Code Playgroud)

因为AND的优先级高于OR - 但与这种情况更相关 - 它们都是左向关联的.

因此,简单的解决方案是:

company_id = ? AND (role_id = ? OR role_id = ? OR role_id = ?)
Run Code Online (Sandbox Code Playgroud)

(但是请参阅其他语法和/或方法的其他答案.我也冒昧地修复了相等运算符.)

快乐的编码.