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)
可能不是最干净的解决方案,但对我来说效果很好!
你可以创建另一个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)