0

複数の OR 条件を連鎖させたい。今、私はそれらを紐のように連鎖させています。NULLしかし、OR句で確認したい値が約 10 ~ 20 個あります。

これは機能します:

Model.where("foo is NULL OR bar is NULL")

しかし、私はむしろ(疑似コード)のようなものが欲しいです:

Model.where("[:foo, :bar] IS NULL")
4

1 に答える 1

2

ActiveRecord はそのままでは「OR」の連鎖をサポートしていませんが、あなたの場合はそれほど難しくありません:

fields = %w{foo bar}
Model.where(fields.map{|f| "#{f} IS NULL"}.join(" OR "))

これが頻繁に必要な場合は、これを再利用可能なメソッドに抽出することもできます。

module ActiveRecord
  class Base
    class << self
      def any_null(fields)
        where(fields.map{|f| "#{quote_column_name f} IS NULL"}.join(" OR "))
      end
    end
  end
end

これで、次のように呼び出すことができます。

Model.any_null(w%{foo bar})

当然、これはテーブル名の自動解決をサポートしていませんが、ほとんどの場合はうまくいくはずです。

于 2013-11-08T15:25:44.467 に答える