我想知道如何才能完成这项工作。假设我有一个属于客户的项目模型。我想将这些特定项目输出到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}]}}
感谢任何帮助!
答案 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(jbuilder,rabl或任何其他)来创建所需的响应。
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客户端的往返次数减少。