我有一个查询,可以按特定顺序获取人员的ID,比如:

然后我想在Person.find(ids)之前把这些人找回来

但它们总是以数字顺序获取,我通过执行以下操作来了解这一点:

people = Person.find(ids).map(&:id)
 => [1, 2, 3, 5, 6, 9]

如何运行此查询,使顺序与ids数组的顺序相同?

我让这项任务变得更加困难,因为我只想执行一次查询,从给定的ID中提取人员.因此,执行多个查询是不可能的.

我试过这样的方法:

ids.each do |i|
  person = people.where('id = ?', i)

但我认为这不管用.

推荐答案

请注意以下代码:

ids.each do |i|
  person = people.where('id = ?', i)

它有两个问题:

首先,#each方法返回它迭代过的数组,因此您只需返回ID即可.你想要的是对方付费

其次,where将返回Arel::Relation对象,该对象最终将作为数组进行计算.所以你会得到一个array.你可以用两种方法解决.

第一种方法是扁平化:

ids.collect {|i| Person.where('id => ?', i) }.flatten

更好的版本:

ids.collect {|i| Person.where(:id => i) }.flatten

第二种方法是简单地进行查找:

ids.collect {|i| Person.find(i) }

这很好也很简单

然而,您会发现,这些都会对每个迭代进行查询,因此效率不高.

我喜欢塞尔吉奥的解决方案,但我想提出另一个建议:

people_by_id = Person.find(ids).index_by(&:id) # Gives you a hash indexed by ID
ids.collect {|id| people_by_id[id] }

我发誓我记得ActiveRecord曾经为我们订购过这个ID.也许它和阿雷尔一起消失了;)

Ruby-on-rails相关问答推荐

如何测试自定义路由?

带有rails 7.1的Lightbox2未初始化

无法安装Ruby错误运行';__rvm_make-J4';,

Rails HMAC - 使用应用程序机密作为加密密钥

BigDecimals 的总和最终成为整数 [Ruby on Rails]

URL 中的 Rails slugs - 使用 Active Record Model Post 的 Title 属性而不是 ID

ActiveRecord 包括.指定包含的列

fields_for 表单构建器对象为零

HABTM 关系 - 如何根据关联模型的属性找到记录

在 Epoch 中将 Ruby 时间戳转换为秒数并返回

form_tag 是否与 Simple_form 一起使用?

Rails:使用 link_to 创建不带 href 的链接

Rails 5.1:未知 firstpos:NilClass - 问题重新加载应用程序

在 ruby​​ 中构建公钥时,是什么导致既不是 PUB key 也不是 PRIV key::nested asn1 错误?

在 Ruby on Rails 中循环对象属性

我可以在 Ubuntu 上使用 apt-get 安装 gems 吗?

Ruby中的参数化获取请求?

反编译开发assets资源 管道

Rails 3 设计,current_user 在模型中不可访问?

RoR select_tag 默认值和选项