2013-07-12 38 views
0

我從父子關係構建Json對象時遇到了一些困難。我有許多孩子的父母模型。從Ruby 2.0中的特定鍵和值構建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: ...... } 

This SO question已經幫助了很多,但我不能完全弄清楚。

我已經試過這樣:

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

這是非常接近(但可怕的期待)。然而,我只得到一個家長的孩子 - 我需要所有的父母與孩子。我只需要孩子的身高和年齡。輸出是這樣的(我已經排除轉化成JSON):

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

它應該是這個樣子:

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

我如何能得到這個輸出格式正確的JSON。

回答

0

首先,您需要的JSON格式有點不正確。

我認爲孩子應該是哈希的數組,如:

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

爲此,您不需要內部#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 
+0

關於格式化的好處。我忘了把它放在..謝謝,全部排序。小號 – simonmorley

0

這裏是我如何做到這一點:

1)每個模型都有一個to_json方法

2)渲染時,渲染JSON:@items。收集(&:to_json)

我不知道爲什麼當調用array.to_json時它不會自動調用to_json子對象。