按父模型包含和分组 JSON

Include and group JSON by parent model

我目前正在打电话 API 获取出版商的图书。然后我将每本书分成不同的故事弧。一切正常,我可以在我的应用程序中检索 JSON。

但是,我想更改我当前的 JSON 响应并删除 JSON 根弧:

有谁知道如何删除 JSON 根并指定我想要的图书属性?

此外,:has many => 通过关联是否有助于简化这一点并按照我想要的方式对事物进行分组?

这是我的代码。

型号

class Publisher < ActiveRecord::Base
  has_many :books
end

class Arc < ActiveRecord::Base
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :arc
  belongs_to :book
end

当前Json

{
  "arcs": [
    {
     "books": [
       {
        "arc_id": 1,
        "created_at":"2014-12-27T20:54:46.518Z",
        "id": 311,
        "publisher_id": 7,
        "updated_at":"2015-06-04T20:55:28.190Z"
       }
     ],
     "id": 1,
     "name": "One-Shot"
   }
  ]
}

怎么改成这样?

[
  {
     "books": [
       {
        "arc_id": 1,
        "id": 311,
        "publisher_id": 7
       }
     ],
     "id": 1,
     "name": "One-Shot"
  }
]

控制器

  def index
    @publisher = Publisher.find(params[:publisher_id])
    @books = @publisher.books.order("positioning")

    @results = {arcs: []}
    @books.group_by(&:arc).each do |arc, books|
      @results[:arcs] << {
        id: arc.id,
        name: arc.name,
        books: books
      }
    end

    respond_to do |format|
      format.html
      format.json { render :json => @results.to_json }
    end
  end 

我也试过在下面的 link 中使用 rabl,但它不起作用..

你可以在没有 arcs 的情况下渲染回来,例如

format.json { render :json => @results[:arcs].to_json }

话虽如此,您也可以将控制器方法也更改为此,但您必须更改 html 响应处理 @results 的方式:

def index
  @publisher = Publisher.find(params[:publisher_id])
  @books = @publisher.books.order("positioning")

  @results = @books.group_by(&:arc).map do |arc, books|
    {  
      id: arc.id,
      name: arc.name,
      books: books
    }
  end

  respond_to do |format|
    format.html
    format.json { render :json => @results.to_json }
  end
end 

这也会给你想要的结果,因为 map 在这种情况下只是 return 你设计的 HashArray