我遇到限制在活动模型资源中序列化的关联级别的问题。
例如:
游戏中有很多团队有很多玩家
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时,它包括子阵列中的所有团队,非常好,但也包括每个团队的所有玩家。这是预期的行为,但是可以限制关联级别吗?让游戏只返回没有玩家的序列化团队吗?
答案 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