我想形成以下查询:
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宝石网站上看到的一个小技巧
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 ")
我有一种感觉可以用吱吱声来回答,但如果有一个纯粹的ActiveRecord回答,我也可以试试这个。
答案 0 :(得分:0)
首先必须flatten
嵌套数组。
TrackedPoint.where((["(id = ? AND zone_id = ?)"] * arr.size).join(" OR "), *(arr.flatten))