1

我将 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 },
              ]
          }
     }
]
4

1 回答 1

2

尝试:

ActiveRecord::Base.include_root_in_json = false

http://apidock.com/rails/ActiveRecord/Serialization/to_json

于 2012-04-16T22:38:40.433 回答