2011-11-23 160 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

谢谢,这大致是解决方案。我调整了一下,但我相信这样做也可以。 –