如何根据另一个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]
我想按results
数组{id}指定的顺序按Foo.id
订购desired_order_ids
。这该怎么做?实际上,上面的查询将检索1000条记录,所以我正在寻找最有效的内存方式吗?
答案 0 :(得分:4)
这取决于您使用的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]))
答案 1 :(得分:1)
您是否需要最终结果为ActiveRecord::Relation
?如果你转换为Array
还好,这应该是最简单的解决方案:
desired_order_ids.map { |id| results[id - 1] }
另一种选择可能是:
results.sort_by { |result| desired_order_ids.index(result.id) }