我将 ActiveRecord 与 Sinatra 一起使用。我有 AR 关系Post has_many Comments
。
我需要在 JSON 中创建返回所有帖子及其评论的响应。它应该如下所示:
[
{
"id":1,
"title:"Title_1",
"comments":[
{ "content":"lorem ipsum", "post_id":1 },
{ "content":"foo bar", "post_id":1 },
]
},
{
"id":2,
"title:"Title_2",
"comments":[
{ "content":"lorem ipsum", "post_id":2 },
{ "content":"foo bar", "post_id":2 },
]
}
]
我认为创建这样的响应是常见的任务,所以我希望应该有一些好的方法来做到这一点。
我的临时解决方案(下面的代码)工作正常,但它太长且不可读:
Post.all.map{|x| x.as_json(include: [:comments]).values[0] }.to_json
这是我发现的另一个解决方案:
Post.all.as_json(include: [:comments]).to_json
可悲的是,返回的结构看起来不同,它将每个帖子包装到附加节点"post: {}"
中。我想避免它。
[
{
"post":{
"id":1,
"title:"Title_1",
"comments":[
{ "content":"lorem ipsum", "post_id":1 },
{ "content":"foo bar", "post_id":1 },
]
}
},
{
"post":{
"id":1,
"title:"Title_2",
"comments":[
{ "content":"lorem ipsum", "post_id":2 },
{ "content":"foo bar", "post_id":2 },
]
}
}
]