我通过MapReduce获取了一些id。我按照某些标准对这些id进行了排序,现在我需要按照特定的顺序获取这些对象:
MyModel.find(ids)
是吗?但它返回的对象并不按存储的ID顺序排列。看起来这只是和...一样。
MyModel.where(:_id.in => ids)
这不会按存储的id顺序返回获取到的对象。
现在我可以这样做
ids.map{|id| MyModel.find(id)}
这个方法可以完成任务,但会对数据库进行多次访问。
我通过MapReduce获取了一些id。我按照某些标准对这些id进行了排序,现在我需要按照特定的顺序获取这些对象:
MyModel.find(ids)
是吗?但它返回的对象并不按存储的ID顺序排列。看起来这只是和...一样。
MyModel.where(:_id.in => ids)
这不会按存储的id顺序返回获取到的对象。
现在我可以这样做
ids.map{|id| MyModel.find(id)}
这个方法可以完成任务,但会对数据库进行多次访问。
我曾经遇到一个类似的问题,发现了一个更加简洁的解决方案:
objs = MyModel.find(ids).sort_by{|m| ids.index(m.id) }
基本上只是使用排序块来捕获元素的索引。
在获取完所有对象后,您可以手动排序。类似这样:
ordering = { }
ids.each_with_index { |id, i| ordering[id] = i }
objs = MyModel.find(ids).sort_by { |o| ordering[o.id] }