Reputation: 5738
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": [
]
}
}
}
]
}
Upvotes: 1
Views: 2262
Reputation: 157
Answer below is correct another approach could be like this:
class OptionTypeSerializer < ActiveModel::Serializer
attributes :id, :key, :customizable, :name, :option_values
# has_many :option_values
def option_values
object.option_values.collect do |ov|
OptionValueSerializer.new(ov)
end
end
end
By using this way you don't need to create object manually you can include decorators in OptionValueSerializer
or include more relationship if you have nested one.
Hope this helps.
Upvotes: 0
Reputation: 5738
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
Upvotes: 2