Activerecord 不等于*任何*值数组的Rails

Activerecord 不等于*任何*值数组的Rails,activerecord,Activerecord,我试过做这样的事情 not_allowed = ['5', '6', '7'] sql = not_allowed.map{|n| "col != '#{n}'"}.join(" OR ") Model.where(sql) 及 我甚至没有为实际的web应用程序这样做,我只是使用rails作为它的模型。所以对我来说没有任何实际的安全问题。但这是一个糟糕的修复,我觉得有义务发布这个问题,因为OR条件使整个where子句始终为真,所以您的第一段代码不起作用。也就是说,如果col的值为5,则5与5不

我试过做这样的事情

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


我甚至没有为实际的web应用程序这样做,我只是使用rails作为它的模型。所以对我来说没有任何实际的安全问题。但这是一个糟糕的修复,我觉得有义务发布这个问题,因为OR条件使整个where子句始终为真,所以您的第一段代码不起作用。也就是说,如果col的值为5,则5与5不同,但与6和7不同,因此where子句的计算结果为:false、true或true,返回true

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

not_allowed = ['1','2', '3']
Model.where('col not in (?)', not_allowed)
这将返回除col与数组中任何元素匹配的记录之外的所有记录

shame = values.map{|v| "where.not(:col => '#{v}')"  }.join(".")
eval("Model.#{shame}")
not_allowed = ['1','2', '3']
Model.where('col not in (?)', not_allowed)