ruby-on-rails - 如何根据ruby中另一个数组的值从数组对象中查找记录

标签 ruby-on-rails ruby

假设我们有一个数组,其中包含需要获取的对象的 ID

这是需要从另一个对象数组中获取的id

`idvalues=[2,3]`

这是对象数组

 array_object=[#<CustomPricing id: 2, base_price: 500>, #<CustomPricing id: 3, base_price: 700>, #<CustomPricing id: 4, base_price: 900>, #<CustomPricing id: 2, base_price: 500>]

我们如何获取具有 id's 23 的对象并将它们放入新数组中。这里也有多个具有相同 ID 的记录,所以只需要第一条记录。

我试过这样

events = idvalues.each {|id_value| array_object.find(id=id_value)}

但这返回了 idvalue 本身,即 [2,3]。我们怎样才能做到这一点?

最佳答案

一个解决方案是:

grouped = array_object.group_by(&:id)
selected = idvalues.uniq.map { |id| grouped[id].first }

(如果 idvalues 数组不包含任何重复项,则可以删除 uniq)

或其他版本

selected = array_object.group_by(&:id).values_at(*id_values).map(&:first)

(请参阅@mudasobwa 对此答案的评论)

这首先按 id 对定价进行分组,然后使用 map 查找 id 到具有该 ID 的第一个定价的映射。

但@mudasobwa 对你的问题的评论显示了解决此问题的更简单方法:

selected = idvalues.map {|id| array_object.find { |o| o.id == id} }

剩下的问题:为什么 array_object 甚至包含重复的定价?

如果它们是唯一的,你可以使用 select:

selected = array_object.select { |pricing| idvalues.includes?(pricing.id) }

你可以先创建数组 uniq:

selected = array_object.select { |pricing| idvalues.includes?(pricing.id) }

(如果数组中的对象实现了适当的相等运算符)

但老实说,我认为数组首先不应包含重复项。这听起来像一个可以优化的查询?

关于ruby-on-rails - 如何根据ruby中另一个数组的值从数组对象中查找记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50803901/

相关文章:

ruby-on-rails - 使用rails_admin为日期字段添加默认值

ruby-on-rails - Rails 2.2 中可重用辅助方法的最佳位置

java - 简单 SSO - 使用自定义身份验证 - CAS 或一些 Oauth 或 openid 服务器?

Ruby Net::HTTP 第二次请求超时

ruby-on-rails - 神秘的: `require "rubygems"` inside controller

ruby-on-rails - Rails heroku 应用程序上的 Robots.txt 文件未更新

ruby-on-rails - ruby /rails : converting a Date to a UNIX timestamp

ruby-on-rails - 使用 EC2 + Rails + Nginx + Capistrano 重启时 Puma 重启失败

javascript - Rails 3 在文件夹之间拖放

ruby-on-rails - Rails Admin Plugin 问题,用于与同一模型的多对多关系