Rails不等于* any *的值数组

时间:2013-11-12 21:37:27

标签: activerecord

我试过做这样的事情

not_allowed = ['5', '6', '7']
sql = not_allowed.map{|n| "col != '#{n}'"}.join(" OR ")
Model.where(sql)

not_allowed = ['5', '6', '7']
sql = not_allowed.map{|n| "col <> '#{n}'"}.join(" OR ")
Model.where(sql)

但这两个都只是返回我的整个表格,这是不准确的。

所以我已经完成了这项工作并且有效:

shame = values.map{|v| "where.not(:col => '#{v}')"  }.join(".")
eval("Model.#{shame}")

我甚至没有为实际的Web应用程序执行此操作,我只是使用rails来获取其模型。所以对我来说没有任何实际的安全问题。但这是一个可怕的解决方案,我觉得有义务发布这个问题

1 个答案:

答案 0 :(得分:4)

您的第一段代码不起作用,因为OR条件使整个where子句始终为true。也就是说,如果col的值为5,则5与5不同,但它不同于6和7,因此,where子句的计算结果为:false OR true或true,返回true。

我认为在这种情况下,您可以使用NOT IN子句,如下所示:

not_allowed = ['1','2', '3']
Model.where('col not in (?)', not_allowed)

这将返回除col匹配数组中任何元素的记录之外的所有记录。