Ruby on rails 按另一个ID数组对activerecord结果集进行排序

Ruby on rails 按另一个ID数组对activerecord结果集进行排序,ruby-on-rails,sorting,Ruby On Rails,Sorting,如何根据另一个ID数组对activerecord结果集进行排序 我对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

如何根据另一个ID数组对activerecord结果集进行排序

我对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
required\u order\u id
id数组指定的顺序对
结果进行排序。如何做到这一点?实际上,上面的查询将检索1000条记录,因此我正在寻找内存效率最高的方法来执行此操作?

这取决于您使用的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]))

您是否需要最终结果为
ActiveRecord::Relation
?如果您对转换为
阵列
很在行,这应该是最简单的解决方案:

desired_order_ids.map { |id| results[id - 1] }
另一个选择是:

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

最有效的方法是在数据库中进行排序,但您需要提供更多有关表格的信息,说明如何对数据进行排序以获得任何有意义的答案。我同意您的观点,但我不想写一篇文章来解释得出结论的背景,即进行db排序不是一种选择。简而言之,我正在查询检索一个结果集,然后对该结果集执行一些统计回归分析,这些分析将专门应用于该结果集,并且无法提前知道(因此无法存储在数据库中)。也许有一种方法可以存储在db中,但我认为这是第一次让它工作。我同意这个答案,因为我能够利用内存中现有的结果集,而不必返回并再次点击db。谢谢,谢谢!正是我需要的!