Techioz Blog

OR 演算子で配列の項目を使用する ActiveRecord Where 句

概要

このような配列があります

arr = %w[android ios]

そして、以下のようなクエリの Where 句でこれらの値を使用したいと考えています。

SELECT * FROM controls
WHERE company_id = '12345' AND (ios > 13 OR android > 14)

ここで、( ) 内のフィールドは配列の値です。つまり、配列に値が 1 つだけある場合は、次のようになります。

 WHERE company_id = '12345' AND (ios > 13)

例えば

Ruby on RailsのActiveRecordを使用することは可能ですか?

解決策

このように配列ではなくハッシュが必要なようです

more_than = {
  ios: 13,
  android: 14
}

プレースホルダーを含む配列から sanitize_sql_for_conditions を使用して SQL 条件文字列を構築できます

sql_condition_array =
  more_than.each_with_object([]) do |(atr, value), sql_array|
    if sql_array.empty?
      sql_array[0] = "#{atr} > ?"
    else
      sql_array[0] << " OR #{atr} > ?"
    end

    sql_array << value
  end
# => ["ios > ? OR android > ?", 13, 14]

sql_condition = Control.sanitize_sql_for_conditions(sql_condition_array)
# => "ios > 13 OR android > 14"

または直接かもしれません

sql_condition = more_than.map { |atr, value| "#{atr} > #{value}" }.join(" OR ")
# => "ios > 13 OR android > 14"

その後

Control.where(company_id: 12345).where(sql_condition)

クエリは次のようになります。

SELECT "controls".* FROM "controls"
WHERE "controls"."company_id" = 12345
AND (ios > 13 OR android > 14);

そのハッシュが 1 つの要素のみで構成される場合、次のように OR は使用されません。

SELECT "controls".* FROM "controls"
WHERE "controls"."company_id" = 12345
AND (ios > 13);