我有一个查询,可以按特定顺序获取人员的ID,例如:
ids=[1,3,5,9,6,2]
然后我想通过Person.find(id)
但它们总是以数字顺序获取,我通过执行以下操作了解这一点:
people=Person.find(id).map(&;:id)
=>;[1, 2, 3, 5, 6, 9]
如何运行此查询以使顺序与ids数组的顺序相同
我使这项任务更加困难,因为我只想执行一次查询,从给定的ID中提取人员。因此,执行多个查询是不可能的
我试过这样的方法:
ids.each do|i|
person=人。其中('id=?',i)
但我认为这不管用
关于此代码的注释:
ids.each do|i|
person=人。其中('id=?',i)
它有两个问题:
首先,#each方法返回它迭代过的数组,因此您只需返回id。你要的是对方付费
其次,where将返回Arel::Relation对象,该对象最终将作为数组进行计算。所以你会得到一个数组。你可以用两种方法解决
第一种方法是扁平化:
ids.collect{| i | Person.where('id=>;?',i)}.flatten
更好的版本:
ids.collect{i|Person.where(:id=>;i)}.flatten
第二种方法是简单地进行查找:
ids.collect{i|Person.find(i)}
这很好也很简单
但是,您会发现,这些都会对每个迭代执行一个查询,因此效率不高
我喜欢塞尔吉奥的解决方案,但我想提出另一个建议:
people\u by\u id=Person.find(id).index\u by(&;:id)#提供按id索引的哈希值
id.collect{| id | people_by_id[id]}
我发誓我记得ActiveRecord曾经为我们订购过这个ID。也许它和阿雷尔一起消失了;)