3

私はこのようなことをしようとしました

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アプリケーションに対してこれを行っているわけではなく、モデル用にレールを使用しているだけです。したがって、実際のセキュリティ上の懸念はありません。しかし、これはひどい修正であり、この質問を投稿する義務があると感じました

4

1 に答える 1

4

OR 条件によって where 句全体が常に true になるため、最初のコードは機能しません。つまり、col の値が 5 の場合、5 は 5 とは異なりませんが、6 および 7 とは異なります。したがって、where 句は false OR true OR true として評価され、true を返します。

この場合、次のように代わりに NOT IN 句を使用できると思います。

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

これにより、col が配列内のいずれかの要素と一致するレコードを除くすべてのレコードが返されます。

于 2013-11-12T22:12:47.453 に答える