代码之家  ›  专栏  ›  技术社区  ›  daveanderson88

如何使用Jbuilder显示父信息,子信息嵌套在下面

  •  0
  • daveanderson88  · 技术社区  · 7 年前

    我正在rails中使用jbuilder在rails应用程序中生成一些JSON。 在我的模型中,“od\U项目”属于“od”,“ods”属于“sophead”。

    我想显示“sophead”的每个“od”,然后嵌套在每个“od”下,我想显示属于“od”的每个“od\U项”。

    以下是我目前的代码:

    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\U项”嵌套在它所关联的“od”中,而不是它旁边。

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   mabe02    7 年前

    如果您的 @sophead.ods 是一个哈希的集合,可以很容易地实现它的合并 od 元素及其 od_items :

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

    因为这些似乎是活动记录:

    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