在JBuilder中生成嵌套的JSON数组

我在轨道上的ruby中有这个型号

分支模型:has_many:菜单

class Branch < ActiveRecord::Base belongs_to :place belongs_to :city has_many :menus , dependent: :destroy belongs_to :type_place end 

菜单型号:has_many:产品

 class Menu < ActiveRecord::Base attr_accessible :description, :product_name, :price, :category_id, :menu_id belongs_to :branch has_many :products, dependent: :destroy end 

产品型号:

 class Product < ActiveRecord::Base belongs_to :menu belongs_to :category end 

在视图中使用以下代码:

 if @condition json.code :success json.branch do json.array!(@branches) do |json, branch| json.(branch, :id, :branch_name, :barcode) json.menu branch.menus, :id, :menu_name end end else json.code :error json.message 'Mensaje de error' end 

得到:

 { "code": "success", "branch": [ { "id": 1, "branch_name": "Sucursal 1", "barcode": "zPOuByzEFe", "menu": [ { "id": 2, "menu_name": "carta sucursal 1" } ] }, { "id": 2, "branch_name": "Sucursal Viña Centro", "barcode": "RlwXjAVtfx", "menu": [ { "id": 1, "menu_name": "carta viña centro" }, { "id": 5, "menu_name": "carta viña centro vinos" } ] }, { "id": 3, "branch_name": "dddd", "barcode": "eSbJqLbsyP", "menu": [ ] } ] } 

但是当我得到每个菜单的产品时,我怀疑我需要迭代菜单,但我尝试了几种方法却没有成功。

我不确定您的产品可以具有哪些属性,但我会尝试以下方式:

 if @condition json.code :success json.array!(@branches) do |json, branch| json.(branch, :id, :branch_name, :barcode) json.menus branch.menus do |json,menue| json.id menue.id json.menu_name menue.menu_name json.products menue.products do |json, product| json.product_attribute_1 product.product_attribute_1 end end end else json.code :error json.message 'Mensaje de error' end 

我也不太确定为什么你试图在一个分支下嵌套@branches,如下所述:

 json.branch do ... end 

我刚刚删除了。

这是来自docs(“this”是“json.array!方法” http://www.rubydoc.info/github/rails/jbuilder/Jbuilder:array

通常只需要将此方法用于顶级数组。 如果您已命名数组,则可以执行以下操作:

 json.people(@people) do |person| json.name person.name json.age calculate_age(person.birthday) end { "people": [ { "name": David", "age": 32 }, { "name": Jamie", "age": 31 } ] } 

我有使用数组的意外行为! 和建议的常规迭代完美地工作,使我的代码非常可读:

 json.user do json.email @user.email json.devices @user.devices do |device| json.partial! 'devices/device', device: device end end