我通过MapReduce获取了一些ID。我已经按照某些标准对这些ID进行了排序,现在我需要按照这个特定的顺序获取这些对象:
MyModel.find(ids)
右?但它返回的对象不是存储ids的顺序。看起来这和
一样MyModel.where(:_id.in => ids)
,它不会以与存储的id相同的顺序返回提取的对象。
现在我可以这样做
ids.map{|id| MyModel.find(id)}
这将完成这项工作,但它会多次敲击数据库。
答案 0 :(得分:10)
正在处理类似的问题,并找到了更简洁的解决方案:
objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) }
基本上只是使用sort块来阻止元素的索引。
答案 1 :(得分:9)
您可以在拥有所有物品后手动进行排序。像这样:
ordering = { }
ids.each_with_index { |id, i| ordering[id] = i }
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] }