0

私はこのようなルビーハッシュを持っています

[{user_id:3、購入:{金額:2、type_id:3、名前: "チョコレート"}、
 {user_id:4、購入:{金額:1、type_id:3、名前: "chocolate"}、
 {user_id:5、購入:{金額:10、type_id:4、名前: "penny-candy"}]

配列を取得してtype_idでマージし、金額を合計し、ユーザーを金額に接続したいので、最終結果は次のようになります。

[{type_id:3、name: "chocolate"、total_amounts:3、user_purchases [{user_id:3、amount:2}、user_id:4、amount:1}]、
{type_id:4、name: "penny-candy"、total_amounts:10、[{user_id:5、amount:2}]}]

あるタイプの出力から別のタイプの出力にどのように移行しますか?

4

2 に答える 2

1

group_by の問題です。私はあなたに2を与えます:

new_array = old_array.group_by{|x| x[:purchase][:type_id]}.values.map do |group|
  {:type_id => group[0][:purchase][:type_id], :total_amounts => group.map{|g| g[:purchase][:amount]}.reduce(&:+)}
end

他の2つは演習として残します

于 2012-06-18T06:51:23.670 に答える
0

私は最初にそれを単純化します:

old_arr =  [
 {user_id: 3, purchase: {amount: 2, type_id:3, name:"chocolate"}},
 {user_id: 4, purchase: {amount: 1, type_id:3, name: "chocolate"}},
 {user_id: 5, purchase: {amount: 10, type_id:4, name: "penny-candy"}}]

intermediate_arr = old_arr.map{ |h| [h[:user_id], h[:purchase][:amount], h[:purchase][:type_id], h[:purchase][:name]]}

これにより、次の配列が作成されます。

[[3, 2, 3, "chocolate"], [4, 1, 3, "chocolate"], [5, 10, 4, "penny-candy"]]

これで、好きなようにフォーマットできます。私は次のようにフォーマットすることにしました:

new_hash = {}
intermediate_arr.each do |arr|
  if new_hash[arr[2]]
    new_hash[arr[2]][:purchase] += [{user_id: arr[0], amount: arr[1]}]
  else
    new_hash[arr[2]] = {name: arr[3], purchase: [{user_id: arr[0], amount: arr[1]}]}
  end
end

与える:

{3=>{:name=>"chocolate", :purchase=>[{:user_id=>3, :amount=>2}, {:user_id=>4, :amount=>1}]}, 4=>{:name=>"penny-candy", :purchase=>[{:user_id=>5, :amount=>10}]}}
于 2012-06-18T06:27:27.753 に答える