Ruby on rails 按另一个ID数组对activerecord结果集进行排序
如何根据另一个ID数组对activerecord结果集进行排序 我对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
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。谢谢,谢谢!正是我需要的!