Ограничивающие ассоциации Каскад в Active Serializer модели

У меня проблема с ограничением уровня ассоциаций, сериализованных в активном ресурсе модели.

Например:

В игре есть много команд, у которых много игроков.

class GameSerializer < ActiveModel::Serializer
  attributes :id
  has_many :teams
end

class TeamSerializer < ActiveModel::Serializer
  attributes :id
  has_many :players
end

class PlayerSerializer < ActiveModel::Serializer
  attributes :id, :name
end

Когда я получаю JSON для команды, он включает всех игроков в подвале, по желанию.

Когда я получаю JSON для игры, он включает в себя все команды в подвале, отличные, но также и все игроки для каждой команды. Это ожидаемое поведение, но возможно ли ограничить уровень ассоциаций? Играйте в игру только с сериализованными командами без игроков?

Ответ 1

Другим вариантом является злоупотребление загрузкой Rails, чтобы определить, какие ассоциации для рендеринга:

В контроллере rails:

def show
  @post = Post.includes(:comments).find(params[:id])
  render json: @post
end

затем на земле AMS:

class PostSerializer < ActiveModel::Serializer
  attributes :id, :title
  has_many :comments, embed: :id, serializer: CommentSerializer, include: true

  def include_comments?
    # would include because the association is hydrated
    object.association(:comments).loaded?
  end
end

Наверное, это не самое чистое решение, но оно отлично работает для меня!

Ответ 2

Вы можете создать еще один Serializer:

class ShortTeamSerializer < ActiveModel::Serializer
  attributes :id
end

Тогда:

class GameSerializer < ActiveModel::Serializer
  attributes :id
  has_many :teams, serializer: ShortTeamSerializer
end

Или вы можете определить include_teams? в GameSerializer:

class GameSerializer < ActiveModel::Serializer
  attributes :id
  has_many :teams

  def include_teams?
    @options[:include_teams]
  end
end