0

次のクエリを作成したいと思います。

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
4

1 に答える 1

0

flatten最初にネストされた配列にする必要があります。

TrackedPoint.where((["(id = ? AND zone_id = ?)"] * arr.size).join(" OR "), *(arr.flatten))
于 2013-10-17T13:31:50.050 に答える