在活动模型序列化器中限制关联级联

时间:2013-05-01 02:38:59

标签: ruby-on-rails-3 active-model-serializers

我遇到限制在活动模型资源中序列化的关联级别的问题。

例如:

游戏中有很多团队有很多玩家

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时,它包括子阵列中的所有团队,非常好,但也包括每个团队的所有玩家。这是预期的行为,但是可以限制关联级别吗?让游戏只返回没有玩家的序列化团队吗?

2 个答案:

答案 0 :(得分:12)

另一种选择是滥用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

可能不是最干净的解决方案,但对我来说效果很好!

答案 1 :(得分:8)

您可以创建另一个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