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 回答