Rails中使用JSONAPI::Serializer无法正确关联评论数据求助
问题描述
我正在用Ruby on Rails 7.0.6和React开发评论系统,此前功能正常:用户可发布评论,产品可接收评论,但当前遇到序列化相关问题。
相关模型代码:
Product模型
class Product < ApplicationRecord has_many :comments end
User模型
class User < ApplicationRecord has_many :comments end
Comment模型
class Comment < ApplicationRecord belongs_to :Product belongs_to :user end
我希望在产品详情页用JSONAPI::Serializer(版本2.2.0)渲染Product数据,控制器调用代码:
def show render json: ProductSerializer.new(@product, { include: [:comments] }) end
ProductSerializer代码:
class ProductSerializer include JSONAPI::Serializer attributes :id, :created_at, :description has_many :comments end
当前问题:
- JSON响应中未包含comments;
- 尝试指定CommentSerializer后仍无效;
- 若将comments加入attributes,虽能获取评论列表,但仅得到user_id而非关联的User对象。
解决方案
1. 修复模型关联大小写错误
Comment模型中belongs_to :Product使用了大写符号,Rails关联要求用小写符号,这会导致关联加载失败,序列化无法获取评论数据。修改Comment模型:
class Comment < ApplicationRecord belongs_to :product # 改为小写 belongs_to :user end
2. 预加载关联数据
控制器中未预加载关联的话,序列化时可能因懒加载导致数据未被包含,修改show动作,用includes预加载评论及关联用户:
def show @product = Product.includes(:comments, comments: :user).find(params[:id]) render json: ProductSerializer.new(@product, include: [:comments, 'comments.user']) end
3. 配置CommentSerializer并关联
创建CommentSerializer,指定关联的user,并在ProductSerializer中明确指定该序列化器:
# app/serializers/comment_serializer.rb class CommentSerializer include JSONAPI::Serializer attributes :id, :content, :created_at # 按实际评论字段调整 belongs_to :user end
更新ProductSerializer:
class ProductSerializer include JSONAPI::Serializer attributes :id, :created_at, :description has_many :comments, serializer: CommentSerializer end
4. 正确使用include参数
若需要同时返回评论及评论所属用户,include参数需明确指定嵌套关联,写成include: [:comments, 'comments.user'],序列化器才会递归加载关联数据。
内容的提问来源于stack exchange,提问作者Unik6065
相关产品推荐
相关产品推荐

