次のクエリを作成したいと思います。
SELECT tracked_points.*
FROM tracked_points
WHERE
(id = 87 AND zone_id = 457)
OR
(id = 88 AND zone_id = 457)
[id, zone_id]
関数への入力は、次のようなネストされた配列になります。
[[87, 457], [88, 457]]
squeel gemのサイトで見かけたちょっとした裏技をやってみた
arr = [[87, 457], [88, 457]]
TrackedPoint.where((["(id = ? AND zone_id = ?)"] * arr.size).join(" OR "), *arr)
しかし、ネストされた配列を引数として取るのは好きではありません。
私が思いついたソリューションは、SQL 文字列をコンパイルするだけで、準備されたステートメントのパラメーター サニテーションを使用しません。
matches = arr.map do |i|
"(id = #{i[0]} AND zone_id = #{i[1]})"
TrackedPoint.where(matches.join(" OR ")
私はsqueelで答えが可能だと感じていますが、純粋なActiveRecordの答えがあれば、それも試してみます.
- レール 3.2.13
- ルビー 1.9.3-p392