按父模型包含和分组 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 你设计的 Hash
的 Array
。
我目前正在打电话 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 你设计的 Hash
的 Array
。