JBuilder dynamic keys for model attributes

zack picture zack · Aug 9, 2013 · Viewed 9.7k times · Source

I'm trying to build a JSON file to access a product's variation via a variation code. Ideally, I could call variations.abcdefgh essentially asking to define a structure like this:

{
   "variations":{
      "abcdefgh":{
         "available":true,
         "price":"12.00"
      },
      "ijklmnop":{
         "available":false,
         "price":"25.00"
      }
   }
}

Doing something in products/show.json.jbuilder like

json.variations @product.variations

gives me formatting as such:

{
   "variations":[
      {
         "available":true,
         "price":"12.00",
         "product_code":"abcdefgh"
      },
      {
         "available":true,
         "price":"25.00",
         "product_code":"ijklmnop"
      }
   ]
}

maybe my JavaScript could be better, but I want something a little more accessible based on the product_code. The closest I've gotten has been

@product.variations.each do |variation|
   json.set! variation.product_code, variation
end

but I've yet to find a solution that will put these correctly formatted objects as children into a variations attribute. Anyone run into something similar before?

Answer

cristi_razvi picture cristi_razvi · Feb 6, 2014
json.set! :variations do
  @variations.each do |variation|
    json.set! variation.product_code do
      json.(variation, :available, :price)
    end
  end
end

^^ this should do it