2015-10-25 27 views
1

如何基於另一個ID數組來訂購此活動記錄結果集?使用另一個ID數組對活動記錄結果集進行排序

我在我的ActiveRecord模型執行初始查詢:

results = Foo.first(5) 
results.each do |r| 
    #do some stuff initially with these records. 
    #5 records returned with ids: 1, 2, 3, 4, 5 
end 

我然後做一些進一步的處理,這導致ID的另一個陣列:

desired_order_ids = [3,1,4,5,2] 

我想通過Foo.id在訂購resultsdesired_order_ids ID數組指定的順序。這個怎麼做?實際上,上述查詢將檢索1000條記錄,所以我正在尋找最有效的內存方式來執行此操作?

+0

最有效的方式是在數據庫中進行排序,但你需要提供有關表格的更多信息,瞭解如何對數據進行排序以獲得有意義的答案。 – max

+0

我同意你的看法,但我不想寫一篇文章來解釋後來的結論,即做一個數據庫分類不是一種選擇。簡而言之,我查詢檢索結果集,然後對該結果集執行一些統計迴歸分析,該結果集將專門應用於該結果集並且不能提前知道(因此不能存儲在數據庫中)。也許有一種方法可以在db中存儲,但我會說這是第一次讓它工作。 – joshweir

回答

1

你所需要的最終結果是一個ActiveRecord::Relation?如果你是罰款轉換爲Array,這應該是最簡單的解決方案:

desired_order_ids.map { |id| results[id - 1] } 

另一種選擇可能是:

results.sort_by { |result| desired_order_ids.index(result.id) } 
+1

我回答了這個問題,因爲我可以利用內存中的現有結果集,而無需返回並再次點擊db。謝謝 – joshweir

3

這取決於你正在使用的DBMS,但我認爲這將在大多數數據庫工作:

Foo.all.order('id=3 desc, id=1 desc, id=4 desc, id=5 desc, id=2 desc') 

可以使用的方法來構建傳遞給order這樣的說法:

def order_string(field_name, arr) 
    arr.map { |val| "#{field_name}=#{val} desc" }.join(', ') 
end 

,並調用它像:

Foo.all.order(order_string('id', [3, 1, 4, 5, 2])) 
+0

謝謝!正是我需要的! –

相關問題