Search code examples
ruby-on-railsjsonrubyjbuilder

Rails json/jbuilder - Group json view based on category


I have an web application maded in RoR. I need to provide the json to an mobile App. This is my code to generate the Json:

json.category do
 json.name monument.category.name
 json.monumento do
  json.name monument.name
  json.id monument.id
  json.pois monument.pois do |p|
   json.name p.name
  end
 end
end

The output is:

{
    "category": {
        "name": "Igrejas",
        "monumento": {
            "name": "Igreja de Santa Maria do Olival",
            "id": 2,
            "pois": [{
                "name": "Igreja de Santa Maria do Olival"
            }]
        }
    }
},
{
    "category": {
        "name": "Igrejas",
        "monumento": {
            "name": "Igreja de São João Baptista",
            "id": 3,
            "pois": [{
                "name": "Igreja de São João Baptista"
            }]
        }
    }
},
{
    "category": {
        "name": "Igrejas",
        "monumento": {
            "name": "Igreja da Nossa Senhora da Graça",
            "id": 4,
            "pois": [{
                "name": "Igreja da Nossa Senhora da Graça"
            }]
        }
    }
},

My Problem is that i need to group the categories.

something like this:

{
    "category": {
        "name": "Igrejas",
        "monumento": {
            "name": "Igreja de Santa Maria do Olival",
            "id": 2,
            "pois": [{
                "name": "Igreja de Santa Maria do Olival"
            }]
        },
        "monumento": {
            "name": "Igreja de São João Baptista",
            "id": 3,
            "pois": [{
                "name": "Igreja de São João Baptista"
            }]
        },

        "monumento": {
            "name": "Igreja da Nossa Senhora da Graça",
            "id": 4,
            "pois": [{
                "name": "Igreja da Nossa Senhora da Graça"
            }]
        }
    }
},

Any ideas how can i solve this problem?


Solution

  • You need to do something like this

    In your controller,

    @categories = Category.where(name: 'Igrejas').includes(monuments: :pois)
    

    In your view,

    json.category @categories do |category|
      json.name category.name
      json.monuments category.monuments do |monument|
        json.name monument.name
        json.id monument.id
        json.pois monument.pois do |p|
          json.name p.name
        end
      end
    end