在JBuilder中生成嵌套的JSON数组

时间:2014-01-06 21:38:49

标签: ruby-on-rails ruby json jbuilder

我在轨道上的红宝石中有这个型号

分支模型:has_many:菜单

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

菜单型号:has_many:products

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": [

   ]
  }
 ]
}

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

2 个答案:

答案 0 :(得分:13)

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

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

我刚删除了那个。

答案 1 :(得分:0)

这是来自文档(&#34;这&#34;是&#34; 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