Создайте вложенный массив JSON в JBuilder

У меня есть эти модели в рубине на рельсах

Модель ветки: has_many :menus

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

   ]
  }
 ]
}

Но как я получаю продукты из каждого меню? Я подозреваю, что мне нужно перебирать меню, но я безуспешно пробовал несколько способов.


person FrancoML    schedule 06.01.2014    source источник


Ответы (2)


Я не уверен, какие атрибуты может иметь ваш продукт, но я бы попробовал что-то вроде:

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

я только что удалил это.

person jethroo    schedule 06.01.2014
comment
Хммм, у меня это сработало без передачи json в качестве первого аргумента, и я также использовал json .extract! вместо синтаксиса: json.(ветка, :id, :branch_name, :barcode). - person Rebekah Waterbury; 07.10.2015

Это из документации ("это" метод "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
person Riley Guerin    schedule 07.12.2016