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

时间:2015-10-25 08:42:36

标签: 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,1,4,5,2]

我想按results数组{id}指定的顺序按Foo.id订购desired_order_ids。这该怎么做?实际上,上面的查询将检索1000条记录,所以我正在寻找最有效的内存方式吗?

2 个答案:

答案 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) }