Limiting Associations Cascade in Active Model Serializer

给你一囗甜甜゛ 提交于 2019-12-18 10:31:22

问题


I'm having an issue with limiting the level of associations serialized within an active model resource.

For example:

A Game has many Teams which has many Players

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

When I retrieve the JSON for the Team, it includes all the players in a sub array, as desired.

When I retrieve the JSON for the Game, it includes all the Teams in a sub array, excellent, but also all the players for each Team. This is the expected behaviour but is it possible to limit the level of associations? Have Game only return the serialized Teams without the Players?


回答1:


Another option is to abuse Rails' eager loading to determine which associations to render:

In your rails controller:

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

then in AMS land:

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

Probably not the cleanest solution, but it works nicely for me!




回答2:


You can create another Serializer:

class ShortTeamSerializer < ActiveModel::Serializer
  attributes :id
end

Then:

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

Or you can define a include_teams? in GameSerializer:

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

  def include_teams?
    @options[:include_teams]
  end
end


来源:https://stackoverflow.com/questions/16311989/limiting-associations-cascade-in-active-model-serializer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!