1

I have a hash in this format.

@company_details = {org_id1 => [employee1, employee2, employee3, employee4], org_id2 => [employee1, employee2, employee3, employee4] ... }

I want something like:

[
    {
        "org_id": "1234",
        "employees": [
            {
                "employee_id": 1,
                "company": "Pepsi",
            },  
            {
                    "employee_id": 2,
                    "company": "Coke",
            },
            {
                "employee_id": 3,
                "company": "Dr. Pepper",
            }
        ]
    },
    {
        "org_id": "3433",
        "employees": [
            {
                "employee_id": 5,
                "company": "Mirinda",
            },  
            {
                    "employee_id": 8,
                    "company": "7up",
            },
            {
                "employee_id": 13,
                "company": "Hersheys",
            }
        ]
    }
]

I tried something like

//index.json.jbuilder
@company_details.each do |key,value|
  json.org_id key
  json.employees value
end

How to customize the value so only some attributes get displayed?

  • Have you taken a look at this? http://stackoverflow.com/questions/14084117/using-jbuilder-to-create-nested-json-output-in-rails – userFriendly Aug 20 '15 at 16:17

1 Answers1

0

Try this:

companies = @company_details.reduce([]) do |acc, (key, value)|
  employees = value.map do |employee|
    {
      employee_id: employee.id,
      company_name: employee.company.name
    }
  end
  acc.push({ org_id: key, employees: employees })
end

json.array!(companies)

Without knowing much about what your employee record looks like, I'm guessing as to the variable names, but you can adjust that to fit your needs.

In short, this will reduce your hash by key-value pairs into an array of hashes, while mapping each array of employee records with only the attributes you need.

Steven Schobert
  • 4,201
  • 3
  • 25
  • 34