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

时间:2011-09-22 18:55:06

标签: ruby-on-rails ruby activerecord

我有这个查询,但它没有给我预期的结果: 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。

4 个答案:

答案 0 :(得分: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 = ?)

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

快乐的编码。

答案 1 :(得分:3)

可能是一些事情。

首先使用单个等于=,而不是==中的双等于:conditions => "..."

其次,您可以使用"...AND role_id IN (?,?,?)", X, 1, 2, 3]),或者您需要将role_id与括号进行比较,以便condition AND (condition OR condition OR condition)

答案 2 :(得分:1)

您可能需要调查https://github.com/binarylogic/searchlogic

然而,否则你可以说

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

答案 3 :(得分:0)

为了将来的参考,这有助于我轻松放松这种发现,你可以这样做:

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