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

Gre*_*sen 12 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
Run Code Online (Sandbox Code Playgroud)

当我为团队检索JSON时,它根据需要包括子阵列中的所有玩家.

当我为游戏检索JSON时,它包括子阵列中的所有团队,非常好,但也包括每个团队的所有玩家.这是预期的行为,但是可以限制关联级别吗?游戏只返回没有玩家的序列化团队吗?

小智 12

另一种选择是滥用Rails的急切加载来确定要呈现的关联:

在您的rails控制器中:

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

然后在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
Run Code Online (Sandbox Code Playgroud)

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

  • 我在哪里可以调用include_comments?方法? (2认同)

Pab*_* B. 8

你可以创建另一个Serializer:

class ShortTeamSerializer < ActiveModel::Serializer
  attributes :id
end
Run Code Online (Sandbox Code Playgroud)

然后:

class GameSerializer < ActiveModel::Serializer
  attributes :id
  has_many :teams, serializer: ShortTeamSerializer
end
Run Code Online (Sandbox Code Playgroud)

或者你可以定义include_teams?GameSerializer:

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

  def include_teams?
    @options[:include_teams]
  end
end
Run Code Online (Sandbox Code Playgroud)

  • @options来自哪里? (4认同)