假设我们有一个数组,其中包含需要获取的对象的 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
2
和 3
的对象并将它们放入新数组中。这里也有多个具有相同 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/