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);