按选择顺序排序

时间:2011-11-23 17:56:25

标签: ruby-on-rails sorting

这应该是一个简单的问题,但我似乎无法找到一个好的解决方案。我有一个用户正在选择的id列表,我想保留该foos的订单。

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

foos = Foo.find(foo_ids)

有关如何在选择中保留订单的任何想法,或者返回结果集后的假设?

1 个答案:

答案 0 :(得分: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,因为在任何情况下,您的默认范围都不是您想要的范围。所以它可能会稍微(非常小)一点点。

使用find(people_ids)只生成一个查询,无论people_ids有多大。 最糟糕的是做这样的事情:

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

因为它为每个id生成一个查询。

抱歉没有完美答案; - )