2016-04-28 42 views
0

我在導軌4上並使用Postres 9.4。我的代碼目前是這樣的:Rails:在一次調用中獲取兩組ID?

array1 = Model.where(some_condition1).ids 
array2 = Model.where(some_condition2).ids 

有沒有辦法讓只有一個數據庫中讀取相同的結果?形式:

master_array = <the solution> 

和master_array的每個元素的類似形式(其中我知道哪些條件ID滿足):

[id, some_condition1?, some_condition2?] 

,所以我可以很快的做:

array1 = master_array.select { |n| n[1] }.map { |n| n[0] } 
array2 = master_array.select { |n| n[2] }.map { |n| n[0] } 
+0

在你的WHERE中使用OR或者 – fanta

+0

讀取一個數據庫,但你仍然希望它以兩個單獨的數組結束? – siax

+0

在問題中澄清 – pthamm

回答

1

讓我們改變SELECT返回代表每個條件的布爾的id加上兩個自定義列。這將僅使用您要求的屬性填充可愛的小模型,但會將您的自定義列名稱作爲方法進行響應。

results = Model.select("id, #{some_condition1} as condition1, #{some_condition2} as condition2").where("(#{some_condition1}) OR (#{some_condition2}") 

所以後來只是檢查你命名condition1(或任何你想打電話給他們),並創建基於返回true車型的陣列的列。

array1 = results.select(&:condition1).map(&:id) 
array2 = results.select(&:condition2).map(&:id) 
+0

工程就像一個魅力! – pthamm

-1

理想情況下,你會想是這樣的:

Model.where(some_condition1).or.where(some_condition2).pluck(:id) 

但這不可用,yet。你也可以使用arel_table,但是我要做的就是明確寫出查詢。

Model.where('some_condition1 = ? OR some_condition2 = ?', condition1, condition2).pluck(:id) 
+0

上記錄在軌道中可用5 –

+1

這不會導致兩個數組,這(我相信)是OP想要的。 –

0

還要看你的情況複雜一些,但對於相當簡單的條件,我建議你查詢與OR條件

results = Model.where('(some_condition1) OR (some_condition2)') 

然後使用Array select分裂成兩個陣列:

array1 = results.select {|itm| itm == 'something which covers some_condition1'} 
array2 = results.select {|itm| itm == 'something which covers some_condition2'}