2014-01-06 11 views
6

Ich habe diese Modelle in Ruby on RailsGenerieren Sie ein verschachteltes JSON-Array in JBuilder

Zweig Modell: has_many: Menü

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

Menü Modell: has_many: Produkte

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

Produktmodell :

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

mit dem folgenden Code in der Ansicht:

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 

bekommt:

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

    ] 
    } 
] 
} 

Aber als ich die Produkte der einzelnen Menüs bekommen ?, Ich vermute, ich brauche Menü zu durchlaufen, aber ich habe mehrere Möglichkeiten ausprobiert ohne Erfolg.

Antwort

11

Ich bin nicht sicher, die Ihre Produkteigenschaften haben kann, aber ich würde versuchen, so etwas wie:

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 

ich bin auch nicht ganz sicher, warum Sie nisten @branches unter einem Zweig versuchen, wie angegeben von:

json.branch do 
    ... 
end 

ich habe das gerade entfernt.

+0

vielen dank !! hat perfekt funktioniert! – FrancoML

+0

Hmmm es endete für mich arbeiten, ohne JSON in der ersten Arg übergeben und ich auch json .extract! anstelle der Syntax: json. (Zweig,: ID,: Zweigname,: Barcode). –

0

Dies ist aus der Dokumentation ("this" ist die „json.array! Methode) http://www.rubydoc.info/github/rails/jbuilder/Jbuilder:array!

ist es im Allgemeinen diese Methode nur für Arrays Top-Level zu verwenden, benötigt. Wenn Sie Arrays genannt hat können Sie tun:

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 } ] } 

ich unerwartetes Verhalten mit Array und regelmäßige Wiederholung hatte wie vorgeschlagen hat perfekt funktioniert und machte mich auf c ode sehr gut lesbar:

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