Serializing deeply nested associations with active_model_serializers

前端 未结 6 1650
無奈伤痛
無奈伤痛 2020-12-08 06:37

I\'m using Rails 4.2.1 and active_model_serializers 0.10.0.rc2

I\'m new to API\'s and chose active_model_serializers because i

6条回答
  •  余生分开走
    2020-12-08 07:27

    You can change default_includes for the ActiveModel::Serializer:

    # config/initializers/active_model_serializer.rb
    ActiveModel::Serializer.config.default_includes = '**' # (default '*')
    

    In addition, in order to avoid infinite recursion, you can control the nested serialization follows:

    class UserSerializer < ActiveModel::Serializer
      include Rails.application.routes.url_helpers
    
      attributes :id, :phone_number, :links, :current_team_id
    
      # Using serializer from app/serializers/profile_serializer.rb
      has_one :profile
      # Using serializer described below:
      # UserSerializer::TeamSerializer
      has_many :teams
    
      def links
        {
          self: user_path(object.id),
          api: api_v1_user_path(id: object.id, format: :json)
        }
      end
    
      def current_team_id
        object.teams&.first&.id
      end
    
      class TeamSerializer < ActiveModel::Serializer
        attributes :id, :name, :image_url, :user_id
    
        # Using serializer described below:
        # UserSerializer::TeamSerializer::GameSerializer
        has_many :games
    
        class GameSerializer < ActiveModel::Serializer
          attributes :id, :kind, :address, :date_at
    
          # Using serializer from app/serializers/gamers_serializer.rb
          has_many :gamers
        end
      end
    end
    

    Result:

    {
       "user":{
          "id":1,
          "phone_number":"79202700000",
          "links":{
             "self":"/users/1",
             "api":"/api/v1/users/1.json"
          },
          "current_team_id":1,
          "profile":{
             "id":1,
             "name":"Alexander Kalinichev",
             "username":"Blackchestnut",
             "birthday_on":"1982-11-19",
             "avatar_url":null
          },
          "teams":[
             {
                "id":1,
                "name":"Agile Season",
                "image_url":null,
                "user_id":1,
                "games":[
                   {
                      "id":13,
                      "kind":"training",
                      "address":"",
                      "date_at":"2016-12-21T10:05:00.000Z",
                      "gamers":[
                         {
                            "id":17,
                            "user_id":1,
                            "game_id":13,
                            "line":1,
                            "created_at":"2016-11-21T10:05:54.653Z",
                            "updated_at":"2016-11-21T10:05:54.653Z"
                         }
                      ]
                   }
                ]
             }
          ]
       }
    }
    

提交回复
热议问题