Tech note

備忘録

IN句に複数カラム指定するSQLをActive Recordで表現する方法

概要

Ruby on RailsのActive Recordで、IN句に複数カラム指定するSQLを表現する方法。

SQL

SELECT
  *
FROM
  test_table
WHERE
  (test_col1, test_col2) IN (('test1', 'test2'), ('test3', 'test4'));

Active Recordで表現する方法

test_arrays = [
  ['test1', 'test2'],
  ['test3', 'test4']
]
test1 = test_arrays.map do | array |
  TestTable.where(
    test_col1: array[0],
    test_col2: array[1]
  )
end
test2 = test1.reduce{|sum, v| sum.or(v)}

こちらの短縮版は、以下の通りになる。

test_arrays = [
  ['test1', 'test2'],
  ['test3', 'test4']
]
test1 = test_arrays.map do | array |
  TestTable.where(
    test_col1: array[0],
    test_col2: array[1]
  )
end.reduce(&:or)