ActiveRecord使用数组数组作为参数

时间:2013-10-10 15:22:11

标签: sql ruby-on-rails activerecord squeel

我想形成以下查询:

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回答,我也可以试试这个。

  • Rails 3.2.13
  • ruby​​ 1.9.3-p392

1 个答案:

答案 0 :(得分:0)

首先必须flatten嵌套数组。

TrackedPoint.where((["(id = ? AND zone_id = ?)"] * arr.size).join(" OR "), *(arr.flatten))