1

親と子の関係からjsonオブジェクトを構築するのに少し行き詰まっています。多くの子を持つ親モデルがあります。

私はJSONオブジェクトを次のように作成しようとしています:

{ parent_1.name: { parent_1.child.age, parent_1.child.height}, parent_1.name: { child_2.age, child_2.height}, parent_2.name: ...... }

この SO の質問は大いに役立ちましたが、完全には理解できません。

私はこれを試しました:

Parent.all.inject({}) { |hsh, p| hsh[p.name] = { p.name => p.children.inject({}) { |h,v| h[v] = {age: v.age, height: v.height}} }}

これは本当に近いです(しかし恐ろしい見た目です)。ただし、私は 1 つの親の子供しか取得しません。子供を持つすべての親が必要です。子供たちの身長と年齢だけが必要です。出力は次のようになりました (json への変換は除外しました)。

{"BarryWhite"=>{:age=>"12", :height=>"45cm"}}

次のようになります。

{"BarryWhite"=>{:age=>"12", :height=>"45cm"}, {:age => "34", :height => "108cm"}, "AndyMurray"=>{:age=>"14", :height=>"125cm"}}    

これを正しくフォーマットされたjsonを出力するにはどうすればよいですか。

4

2 に答える 2

1

まず、必要な JSON 形式が少し間違っています。

子は、次のようなハッシュの配列である必要があると思います。

{
  'BarryWhite' => [
    { :age => '12', :height => '45cm'  },
    { :age => '34', :height => '108cm' }
  ]
  'AndyMurray' => [
    { :age => '14', :height => '125cm' }
  ]
}

これには、ハッシュではなく配列が必要なため、内部の #inject は必要ありません。

また、ハッシュで #inject を少し間違って使用しています。#inject は、最後に実行されたステートメントをループに通すことでハッシュを構築します。最後に実行されたステートメントは、変数「p」の現在の値のみを返す代入です。常に「hsh」全体を返す必要があります。

実用的なソリューションは次のとおりです。

Parent.all.inject({}) do |hsh, p|
  hsh[p.name] = p.children.map { |c| {age: c.age, height: c.height} }
  hsh
end
于 2013-07-12T14:58:47.653 に答える