将动态生成的属性合并到新条目中并对其值求和



我正在寻找一些关于如何将一些键/值对正确合并到单独的数据库条目中并对其值求和的建议。我有一个Task,它有一个Vendor_Upload,它有很多Vendor_Shipping_Logs有很多Vendor_Shipping_Log_Products。 我不确定深层嵌套是否有所作为,但这里要查看的重要值是 Item_IDQuantity .

这是当前参数的吐出方式:

Parameters: {
  "task"=>{
    "task_type"=>"Vendor Upload",
    "vendor_upload_attributes"=>{
      "upload_type"=>"Warranty Orders", 
      "vendor_shipping_logs_attributes"=>{
        "1490674883303"=>{
          "guest_name"=>"Martin Crane", 
          "order_number"=>"33101", 
          "vendor_shipping_log_products_attributes"=>{
            "1490675774108"=>{
              "item_id"=>"211", 
              "quantity"=>"3"
            }, 
            "1490675775147"=>{
              "item_id"=>"213", 
              "quantity"=>"6"
            }
          }
        }, 
        "1490674884454"=>{
          "guest_name"=>"Frasier Crane", 
          "order_number"=>"33102", 
          "vendor_shipping_log_products_attributes"=>{
            "1490675808026"=>{
              "item_id"=>"214", 
              "quantity"=>"10"
            }, 
            "1490675808744"=>{
              "item_id"=>"213", 
              "quantity"=>"1"
            }
          }
        }, 
        "1490674885293"=>{
          "guest_name"=>"Niles Crane", 
          "order_number"=>"33103", 
          "vendor_shipping_log_products_attributes"=>{
            "1490675837184"=>{
              "item_id"=>"211", 
              "quantity"=>"3"
            }
          }
        }, 
        "1490674886373"=>{
          "guest_name"=>"Daphne Moon", 
          "order_number"=>"33104", 
          "vendor_shipping_log_products_attributes"=>{
            "1490675852950"=>{
              "item_id"=>"213", 
              "quantity"=>"8"
            }, 
            "1490675853845"=>{
              "item_id"=>"214", 
              "quantity"=>"11"
            }
          }
        }
      }
    }
  }
}

提交后,我想合并每个独特的Vendor_Shipping_Log_Product Item_ID,并将它们的数量汇总到一个新的Stockmovement_Batch中,作为嵌套Stockmovement,以使我的库存保持最新。

请参阅此处的示例 patameter,了解我希望输出的样子:

Parameters: {
  "stockmovement_batch"=>{
    "stockmovement_type"=>"Ecomm Order", 
    "stockmovements_attributes"=>{
      "1490676054881"=>{
        "item_id"=>"211", 
        "adjust_quantity"=>"-6"
      }, 
      "1490676055897"=>{
        "item_id"=>"213", 
        "adjust_quantity"=>"-15"
      }, 
      "1490676057616"=>{
        "item_id"=>"214", 
        "adjust_quantity"=>"-21"
      }
    }
  }
}

这是我可以一次完成所有工作的事情,还是我必须坚持以单独的形式完成每个过程?

首先,您需要分离出要迭代的值:

data = params.require("task")
                      .require("vendor_upload_attributes")
                      .require("vendor_shipping_logs_attributes")

然后拉出vendor_shipping_log_products_attributes并将其展平为哈希数组:

logs = data.values.map do |h|
  h["vendor_shipping_log_products_attributes"].values
end.flatten

# => [{"item_id"=>"211", "quantity"=>"3"}, {"item_id"=>"213", "quantity"=>"6"}, {"item_id"=>"214", "quantity"=>"10"}, {"item_id"=>"213", "quantity"=>"1"}, {"item_id"=>"211", "quantity"=>"3"}, {"item_id"=>"213", "quantity"=>"8"}, {"item_id"=>"214", "quantity"=>"11"}]

然后,我们通过创建一个中间哈希来合并数据,在该哈希中,我们将item_id用作键。

stockmovements = logs.each_with_object({}) do |hash, memo|
  id = hash["item_id"]
  memo[id] ||= []
  memo[id].push(hash["quantity"].to_i)
end
# => {"211"=>[3, 3], "213"=>[6, 1, 8], "214"=>[10, 11]}

然后,我们可以映射结果并对值求和:

stockmovements.map do |(k,v)|
  {
     item_id: k,
     adjust_quantity: 0 - v.sum
  }
end
# => [{:item_id=>"211", :adjust_quantity=>-6}, {:item_id=>"213", :adjust_quantity=>-15}, {:item_id=>"214", :adjust_quantity=>-21}]

最新更新