2013-10-10 32 views
0

我想形成以下查詢:ActiveRecord的使用數組的數組作爲參數

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 ") 

我有一種感覺,答案是可能的squeel,但如果有一個純粹的ActiveRecord答案我是遊戲也嘗試了。

  • 的Rails 3.2.13
  • 紅寶石1.9.3-P392
+0

ActiveRecord是相當有限的創建複雜的查詢。沒有像squeel這樣的外部附加組件,我認爲你不會比生成這個字符串做得更好。即使你會在SQL中發現一些有趣的更好的方法,你仍然會產生續集字符串。 –

+0

@EdgarsJekabsons任何想法如何我可以添加參數消毒這種方法? –

+0

看看這個方法:http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Quoting.html#method-i-quote 我把它放在連接對象上,所以你應該可以訪問它像這樣:'TrackedPoint.connection.quote'。 –

回答

0

你必須flatten嵌套數組第一。

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