将ActiveRecord对象分组并输出到JSON

时间:2012-05-31 17:01:38

标签: ruby-on-rails json activerecord

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

@projects.group_by(&:client).to_json

ALMOST可以工作,除了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}]}}

感谢任何帮助!

3 个答案:

答案 0 :(得分: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:代码未经过测试

答案 1 :(得分:1)

我建议你看一下gem acts_as_api 。 它使您可以非常轻松地将对象操作为JSON。

答案 2 :(得分:0)

你的orig帖子中的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客户端的往返次数减少。