我有这个查询,但它没有给我预期的结果:
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。
答案 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(',')})")