12

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

例如:

一个游戏有很多团队,有很多玩家

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

4

2 回答 2

12

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

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

于 2013-09-23T22:00:26.357 回答
8

您可以创建另一个Serializer

class ShortTeamSerializer < ActiveModel::Serializer
  attributes :id
end

然后:

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

或者你可以定义一个include_teams?in GameSerializer

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

  def include_teams?
    @options[:include_teams]
  end
end
于 2013-08-11T22:49:33.137 回答