Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails对象的组和和数组_Ruby On Rails_Ruby - Fatal编程技术网

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)

从这一点上讲,您的代码基本上就是这样,但是您可以进行以下更改以获得所需的输出:

  • 您可以按多个属性、名称和id进行分组。在另一种语言中,您可以使用。Ruby没有元组,所以我们可以使用len-2数组:

    .group_by { |p| [p[:item_id], p[:item_name]] }
    .transform_values { |vals| vals.sum { |val| val[:quantity] } }
    
  • 此时,您有一个哈希映射[id,name]元组到quantity:

    { [1,"foo"] => 123, [2, "bar"] => 456 }
    
    您可以使用(或者,如果愿意的话)将其强制为所需的数据类型:

    .reduce([])do | memo,((id,name),quantity)|
    
    备注首先,可以通过将第一个
    映射
    设置为。如果执行此操作,则可以删除展平(1)

    从这一点上讲,您的代码基本上就是这样,但是您可以进行以下更改以获得所需的输出:

  • 您可以按多个属性、名称和id进行分组。在另一种语言中,您可以使用。Ruby没有元组,所以我们可以使用len-2数组:

    .group_by { |p| [p[:item_id], p[:item_name]] }
    .transform_values { |vals| vals.sum { |val| val[:quantity] } }
    
  • 此时,您有一个哈希映射[id,name]元组到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]