配列の中のハッシュをidごとに値を合計した上で一つにまとめたい


以下の処理を`ruby`で行いたいのですが、やり方がわからず困っています。

複数の`[]`から`{}`を取り出し、ひとつの`[]`に格納する。ただし、同じ`id`をもつ`{}`は`num`を合計して一つにまとめる。

[code]

    data1 = [{
      'id' => 1,
      'num' => 1
    },{
      'id' => 2,
      'num' => 3
    },{
      'id' => 3,
      'num' => 5
    }]
    
    data2 = [{
      'id' => 1,
      'num' => 2
    },{
      'id' => 3,
      'num' => 4
    }]
    
    data3 = [{
      'id' => 1,
      'num' => 2
    },{
      'id' => 4,
      'num' => 4
    }]
    
[/code]

↓

[code]

    [{
      'id' => 1,
      'num' => 5
    },{
      'id' => 2,
      'num' => 3
    },{
      'id' => 3,
      'num' => 9
    },{
      'id' => 4,
      'num' => 4
    }]
    
[/code]



[code]

    [data1, data2, data3].flatten.each_with_object([]) {|v, a|
      if ev = a.detect { |ev| v['id'] == ev['id'] }
        ev.merge!(v.merge('num' => v['num'] + ev['num']))
      else
        a << v.dup
      end
    }
    
[/code]

質問内容のコード例ではハッシュのキーは`id`と`num`だけでしたが、  
ハッシュのキーに`id`、`num`以外が含まれているか書かれていなかったのと、  
質問内容の以下の文で

> ただし、同じidをもつ{}はnumを合計して一つにまとめる。

`num`を合計して一つに「まとめる」と書いてあったので、

[code]

    data1 = [{
      'id' => 1,
      'num' => 1,
      'foo' => 'bar'
    },{
      'id' => 2,
      'num' => 3
    },{
      'id' => 3,
      'num' => 5
    }]
    
    data2 = [{
      'id' => 1,
      'num' => 2,
      'bar' => 'buzz'
    },{
      'id' => 3,
      'num' => 4
    }]
    
    data3 = [{
      'id' => 1,
      'num' => 2,
      'hoge' => 'piyo'
    },{
      'id' => 4,
      'num' => 4
    }]
    
    # => [{"id"=>1, "num"=>5, "foo"=>"bar", "bar"=>"buzz", "hoge"=>"piyo"}, {"id"=>2, "num"=>3}, {"id"=>3, "num"=>9}, {"id"=>4, "num"=>4}]
    
[/code]

上記のようなデータが入力されたときのことを考えてコードを書きました。

