如何使用Jbuilder显示嵌套在

时间:2018-03-22 08:51:26

标签: json ruby ruby-on-rails-5 jbuilder

我在rails中使用jbuilder在rails应用程序中生成一些JSON。 在我的模型中,'od_items'属于'od','ods'属于'sophead'。

我想显示'sophead'的每个'od',然后嵌套在每个'od'之下,我想显示属于'od'的每个'od_items'。

到目前为止,这是我的代码:

json.ods @sophead.ods do |od|
  json.od od
  json.od_items od.od_items do |od_item|
    json.od_item od_item
  end
end

这是输出以下JSON:

ods: [
{
od: {
id: 51,
sophead_id: 386,
created_at: "2018-03-21T15:28:48.802Z",
updated_at: "2018-03-21T15:28:48.802Z",
status: "Open"
},
od_items: [
{
od_item: {
id: 285,
od_id: 51,
qty: "1.0",
part: "CARRIAGE CHARGE",
description: "Simpson Carriage Charge",
created_at: "2018-03-21T15:28:48.823Z",
updated_at: "2018-03-21T15:28:48.823Z"
}
},
{
od_item: {
id: 284,
od_id: 51,
qty: "1.0",
part: "MISCELLANEOUS",
description: "Split Box Charge",
created_at: "2018-03-21T15:28:48.816Z",
updated_at: "2018-03-21T15:28:48.816Z"
}
}
]
}
],

问题是我希望'od_items'嵌套在它所涉及的'od'中,而不是它出现在它旁边。

这应该很简单,但我无法在网上找到任何东西。

(关于堆栈溢出的第一个问题 - 非常感谢提前)

1 个答案:

答案 0 :(得分:1)

如果您的@sophead.ods是哈希的集合,则可以轻松地将od元素与其od_items合并:

json.ods @sophead.ods do |od|
  json.od od.merge(od_items: od.od_items)
end

因为它们似乎是ActiveRecords:

json.ods @sophead.ods do |od|
  json.od od.as_json.merge(od_items: od.od_items.map(&:as_json))
end

根据README,获得相同结果的另一种方法是使用json.merge!

json.ods @sophead.ods do |od|
  json.od do
    json.id od.id
    json.sophead_id od.sophead_id
    json.created_at od.created_at
    json.updated_at od.updated_at
    json.status od.status
    json.merge! { od_items: od.od_items.as_json}
end

确保更好表现的另一种方法是使用ActiveModelSerializer代替。

class OdSerializer < ActiveModelSerializers::Model
  attributes :id, :sophead_id, :created_at, :updated_at, :status
  has_many :od_items, serializer: OdItemSerializer
end

class OdItemSerializer < ActiveModelSerializers::Model
  attributes :id, :od_id, :qty, :part, :description, :created_at, :updated_at
end

# And in the controller
render json: @sophead.ods, each_serializer: OdSerializer