Vipin Verma
Vipin Verma

Reputation: 5738

Active Model Serializers data attributes from associations are not loading

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

Answers (2)

Abid
Abid

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

Vipin Verma
Vipin Verma

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

Related Questions