按ID按ID数组给出的顺序查找模型记录

我有一个查询,可以按特定顺序获取人员的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。也许它和阿雷尔一起消失了;)

发表评论