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 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。

4

2 回答 2

1

首先,您需要的 JSON 格式有点不正确。

我认为 children 应该是一个哈希数组,例如:

{
  '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 回答
0

这是我的做法:

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

2)渲染时,渲染json:@items.collect(&:to_json)

我不确定为什么在调用 array.to_json 时它不会自动调用子对象上的 to_json 。

于 2014-03-17T23:56:29.530 回答