2

我想知道如何才能使这项工作。假设我有一个属于客户的项目模型。我想将这些特定项目输出到 JSON,但它们需要按客户分组。我认为这会起作用:

@projects.group_by(&:client).to_json

这几乎可以工作,除了 to_json 方法没有在客户端上调用 .to_json ,因此对于客户端,您可以在 JSON 中得到它:

"#<Client:0x1051d4fb0>":[{ "project":{"name":"My Only Project", "client_id":1}}]

但我真的需要这样:

{"client":{"name":"Home Workers Unite", "id":1, "projects":[{"name":"My Only Project","client_id":1}]}}

任何帮助表示赞赏!

4

3 回答 3

3

正如@LarryK 所说,您想要输出的json 不是有效的json。在 json 中,键只能是字符串,而 ruby​​ 可以将对象作为键。另外,我建议 json 响应更像以下内容:

{clients: [
    {
      "name":"Home Workers Unite", 
      "id":1,
      "projects": [
        {"name":"My First Project", "id":1},
        {"name":"My Second Project", "id":2}
      ]
    }
  ]
}

您已经有可用的项目。您还拥有按客户端对它们进行分组的代码,但to_json对生成的哈希进行简单的处理并不适合这里。您需要进一步操作分组响应才能直接使用to_json

results = {clients: []}
@projects.group_by(&:client).each do |client, projects|
  results[:clients] << {
    id: client.id,
    name: client.name
    projects: projects
  } 
end
results.to_json

这是解决方案的 ruby​​/rails 版本。但是,如果您有一个 json 繁重的应用程序,我建议您使用一些 gem(jbuilderrabl或任何其他)来创建所需的响应。

PS:代码未经测试

于 2012-05-31T18:00:32.523 回答
1

我建议您看一下 gem act_as_api。它使将对象作为 JSON 操作变得非常容易。

于 2012-05-31T17:09:22.447 回答
0

您的原始帖子中的 json 不是有效的 json,因为您没有项目数组的属性名称。

查看来自 Murifox 的acts_as_api 建议和来自 railscasts 的其他 api 技术——他最近刚刚做了一个。

如果您的 api 用户一次只需要一个客户端,您可以使用 json 结构,例如:

{client: {"name":"Home Workers Unite", "id":1},
 projects: [
      {"name":"My Only Project", "client_id":1}
           ]
}

或者您可以发送所需客户和项目信息的子集(或全部):

{clients: [
   {"name":"Home Workers Unite", "id":1},
   {"name":"Factory Workers Unite", "id":2},
          ],
 projects: [
      {"name":"My Only Project", "client_id":1},
      {"name":"Project 2", "client_id":2},
      {"name":"Project 3", "client_id":2}
           ]
}

好处:从服务器到 api 客户端的往返次数更少。

于 2012-05-31T17:18:10.357 回答