2011-11-23 182 views
1

這應該是一個簡單的問題,但我似乎無法找到一個好的解決方案。我有一個用戶正在選擇的id列表,我想保留foos的順序。按選擇順序排序

foo_ids = [1899, 7, 1, 2, 3, 42] 

foos = Foo.find(foo_ids) 

關於如何保留select或select返回結果集之後的命令的任何想法?

回答

1

我不認爲有辦法做到這一點與ActiveRecord。

然而,這裏是我會做什麼:

people_ids = [1899, 7, 2, 3, 42] 

people = Person.unscoped.find(people_ids) 

people_ids.each_with_object(result = []) do |id, result| 
    result << people.detect { person.id == id } 
end 

result # => what you are looking for 

我使用Person.unscoped因爲在任何情況下,您的默認範圍是不是你想要的。所以它可能會稍微快一點。

無論people_ids有多大,使用find(people_ids)只會產生一個查詢。 最糟糕的是做這樣的事情:

people_ids.each_with_object(result = []) do |id, result| 
    result << Person.find(id) 
end 

,因爲它產生的每一個ID查詢。

對不起,沒有完美的答案;-)

+0

感謝您的迴應德爾巴,我肯定會給那個w旋轉,感謝您的輸入! –

+0

謝謝,這大致是解決方案。我調整了一下,但我相信這樣做也可以。 –