9

I have this models in ruby on rails

Branch model: has_many :menus

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

Menu model: 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

Product model:

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

with the following code in the view:

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

gets:

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

   ]
  }
 ]
}

But as I get the products of each menu?, I suspect I need to iterate menu, but I have tried several ways without success.

2 Answers 2

16

I'm not sure which attributes your product can have, but I would try something like:

    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

I'm also not quite sure why you try to nest @branches under a branch as stated by:

    json.branch do
       ...
    end

I just removed that.

Sign up to request clarification or add additional context in comments.

1 Comment

Hmmm it ended up working for me without passing json in as the first arg and I also used json .extract! instead of the syntax: json.(branch, :id, :branch_name, :barcode).
1

This is from the docs ("this" is the "json.array! method) http://www.rubydoc.info/github/rails/jbuilder/Jbuilder:array!

It's generally only needed to use this method for top-level arrays. If you have named arrays, you can do:

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

I had unexpected behaviors using array! and regular iteration as suggested worked perfectly and made my code very readable:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.