设置好宝石后,我尝试获取深层嵌套的多态关联数据。
但是宝石只是渲染了1级关联数据。
序列化器
class CommentsSerializer < ActiveModel::Serializer
attributes :id, :title, :body, :user_id, :parent_id, :commentable_id, :commentable_type
belongs_to :user
belongs_to :commentable, :polymorphic => true
end
经过研究
在active_model_serializers github文档页面上
我已经尝试过此解决方案,但也没有起作用
has_many :commentable
def commentable
commentable = []
object.commentable.each do |comment|
commentable << { body: comment.body }
end
end
请有人可以在这个问题上留个小费吗?
对于某些我应该使用的
ActiveModel::Serializer.config.default_includes = '**'
我也已经尝试过此配置
下面的画面说明了这种情况
此评论有许多可评论的回复,但仅提供一个。我想呈现此评论的其余评论。
答案 0 :(得分:1)
您需要正确定义序列化器,并注意不要递归呈现所有内容。我已经设置了这两个模型:
class Post < ApplicationRecord
has_many :comments, as: :commentable
end
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
这些序列化器:
class CommentSerializer < ActiveModel::Serializer
attributes :id, :body
belongs_to :commentable, serializer: CommentableSerializer
end
class CommentableSerializer < ActiveModel::Serializer
attributes :id, :body
has_many :comments, serializer: ShallowCommentSerializer
end
class ShallowCommentSerializer < ActiveModel::Serializer
attributes :id, :body
end
您需要为帖子的所有评论使用另一个序列化程序,以便评论不会尝试呈现帖子,而是会尝试呈现评论,等等...
保持您的
ActiveModel::Serializer.config.default_includes = '**'
配置选项已打开。
呼叫http://localhost:3000/comments/1
会产生:
{
"id": 1,
"body": "comment",
"commentable": {
"id": 1,
"body": "post",
"comments": [
{
"id": 1,
"body": "comment"
},
{
"id": 2,
"body": "Reply comment"
}
]
}
}
我相信这是您要实现的目标。