Ruby on rails Rails对象的组和和数组
一个产品有很多:生产线, 生产线所属项目:, 项目有一个:配方, 菜谱有很多:菜谱线, 配方行属于:项Ruby on rails Rails对象的组和和数组,ruby-on-rails,ruby,Ruby On Rails,Ruby,一个产品有很多:生产线, 生产线所属项目:, 项目有一个:配方, 菜谱有很多:菜谱线, 配方行属于:项 生产线和配方线具有属性数量。我需要按项目对生产的配方行进行分组,数量等于production\u line.quantity*配方行.quantity def item_quantities array = production_lines.map do |p| p.item.recipe.recipe_lines.map do |r|
生产线
和配方线
具有属性数量
。我需要按项目对生产的配方行进行分组,数量等于production\u line.quantity*配方行.quantity
def item_quantities
array = production_lines.map do |p|
p.item.recipe.recipe_lines.map do |r|
{
item_id: r.item_id,
item_name: r.item.name,
quantity: r.quantity * p.quantity
}
end
end
array.flatten(1).group_by { |p| p[:item_id] }
.transform_values { |vals| vals.sum { |val| val[:quantity] } }
end
这将返回:
item_quantities = {
1: 10,
2: 5
}
其中,key是item_id,value是quantity。值是正确的
然而,我想返回:
item_quantities = [
{
id: 1,
name: "Tomato",
quantity: 10,
},
{
id: 2,
name: "Carrot",
quantity: 5
}
]
我应该如何改变我的解决方案来实现这一点?首先,通过将第一个
映射
转换为。如果执行此操作,则可以删除展平(1)
从这一点上讲,您的代码基本上就是这样,但是您可以进行以下更改以获得所需的输出:
.group_by { |p| [p[:item_id], p[:item_name]] }
.transform_values { |vals| vals.sum { |val| val[:quantity] } }
{ [1,"foo"] => 123, [2, "bar"] => 456 }
您可以使用(或者,如果愿意的话)将其强制为所需的数据类型:
.reduce([])do | memo,((id,name),quantity)|
备注首先,可以通过将第一个映射
设置为。如果执行此操作,则可以删除展平(1)
从这一点上讲,您的代码基本上就是这样,但是您可以进行以下更改以获得所需的输出:
.group_by { |p| [p[:item_id], p[:item_name]] }
.transform_values { |vals| vals.sum { |val| val[:quantity] } }
{ [1,"foo"] => 123, [2, "bar"] => 456 }
您可以使用(或者,如果愿意的话)将其强制为所需的数据类型:
.reduce([])do | memo,((id,name),quantity)|
备注:我认为你分组的第一点有错误。我猜是A}丢失了。我的错,我有一个额外的{
实际上是Yok,所以在group_by中,将p[:item_id]更改为[p.item_id]返回未定义的方法`item_id',在分组之前,我有一个对象数组。每个对象看起来像{“item_id”:“aadc79b9-ff50-4012-b2cb-0deee88138a9”,“item_name”:“南瓜”,“quantity”:“600.0”}是的,我的坏@Catmal这是我的另一个错误,更新后的答案应该是[p[:item\u id],p[:item\u name]]
我想在你做分组的第1点有一个错误。我猜A}缺失。我的坏,我在分组中有一个额外的{
所以,把p[:item\u id]改为[p.item\u id]在分组之前,我有一个对象数组。每个对象看起来像{“item_id”:“aadc79b9-ff50-4012-b2cb-0deee88138a9”,“item_name”:“Pumpkins”,“quantity”:“600.0”}是的,我的坏@Catmal这是我的另一个错误,更新的答案应该是[p[:item_id],p[:item_name]