我试过做这样的事情
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来获取其模型。所以对我来说没有任何实际的安全问题。但这是一个可怕的解决方案,我觉得有义务发布这个问题
答案 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匹配数组中任何元素的记录之外的所有记录。