I am trying to load the association as follows:
This is my controller which is trying to render the json.
#app/controllers/store/products_controller.rb
def customize
@option_types = OptionType.all
respond_to do |format|
format.json { render :json => @option_types}
end
end
This is the serializer for above object
#app/serializers/option_type_serializer.rb
class OptionTypeSerializer < ActiveModel::Serializer
attributes :id, :key, :customizable, :name
has_many :option_values
end
option_value belong_to
option_type
#app/serializers/option_value_serializer.rb
class OptionValueSerializer < ActiveModel::Serializer
attributes :id, :key, :option_type_id, :percentage_price_impact, :fixed_price_impact, :absolute_price_impact, :name
end
This is generating the following JSON. Although a number of other params are specified in the option_value_serializer.rb, only id and type appear in the generated JSON
// http://0.0.0.0:3000/products/810/customize.json
{
"data": [
{
"id": "1",
"type": "option-types",
"attributes": {
"key": "fabric",
"customizable": true,
"name": "FABRIC"
},
"relationships": {
"option-values": {
"data": [
{
"id": "1",
"type": "option-values"
},
{
"id": "2",
"type": "option-values"
}
]
}
}
},
{
"id": "2",
"type": "option-types",
"attributes": {
"key": "cuff-type",
"customizable": false,
"name": "CUFF TYPE"
},
"relationships": {
"option-values": {
"data": [
]
}
}
},
{
"id": "3",
"type": "option-types",
"attributes": {
"key": "vents",
"customizable": false,
"name": "VENTS"
},
"relationships": {
"option-values": {
"data": [
]
}
}
}
]
}
forget the associations, do it this way:
#app/serializers/option_type_serializer.rb
class OptionTypeSerializer < ActiveModel::Serializer
attributes :id, :key, :customizable, :name, :option_values
# has_many :option_values
def option_values
object.option_values.collect do |ov|
{
id: ov.id,
key: ov.key,
option_type_id: ov.option_type_id,
percentage_price_impact: ov.percentage_price_impact,
fixed_price_impact: ov.fixed_price_impact,
absolute_price_impact: ov.absolute_price_impact,
name: ov.name,
description: ov.description,
image: ov.option_image
}
end
end
end