Ограничивающие ассоциации Каскад в 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