ruby-on-rails - Rails active_model_serializers 上的多态嵌套关联
问题描述
设置 gem 后,我尝试获取深层嵌套的多态关联数据。
但 gem 只渲染 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 = '**'
我也试过这个配置
下面的截图说明了这种情况
这条评论有很多可评论的回复,但只呈现一个。我想提出这条评论的其余评论。
解决方案
您需要正确定义序列化程序,并注意不要递归渲染所有内容。我已经设置了这两个模型:
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"
}
]
}
}
我相信,这就是你想要达到的目标。
推荐阅读
- c# - Microsoft 聊天机器人 - 删除机器人响应中的超链接
- javascript - 使用 Face-api.js 检测人脸时出错 HTML视频元素 | HTMLCanvasElement
- python - 如果键和值与其他字典不匹配,则从字典列表中删除字典
- user-interface - Material design框架的建议
- laravel - Laravel - 如何访问集合内的数组
- java - 无法完全模拟 RestHighLevelClient
- json - 如何在 Grafana 中进行 Simple-JSON 变量模板查询?
- java - 当一个表与休眠中的另一个表链接时更新一个表中的列
- whatsapp - 仅使用 HREF 通过 whatsapp 发送文件 (.PDF)
- excel - 比较两列/行以获得完全匹配并突出显示差异