如何在Grape API中加载关联资源?(基于ActiveModelSerializers 0.10)
解决ActiveModelSerializers 0.10中
include关联不生成included数组的问题 我之前在使用AMS 0.10时也碰到过一模一样的问题!只拿到关联关系但没有included数组,核心原因是AMS默认的适配器不支持这种JSON API风格的嵌套输出,得做几个关键调整:
第一步:确保序列化器正确声明关联
首先检查你的RegionSerializer有没有明确定义courts关联,比如:class RegionSerializer < ActiveModel::Serializer attributes :id, :name # 声明has_many关联,若有自定义CourtSerializer也可以指定 has_many :courts, serializer: CourtSerializer end如果没声明这个关联,AMS根本不知道要序列化对应的关联数据。
第二步:启用JSON API适配器
AMS 0.10默认用的是Attributes适配器,这种适配器只会把关联ID放在响应里,不会生成included数组。要切换到JsonApi适配器,有两种方式:- 全局配置(在
config/initializers/active_model_serializers.rb中添加):ActiveModelSerializers.config.adapter = :json_api - 局部临时指定(在控制器/present调用时):
present region, include: ['courts'], adapter: :json_api, with: RegionSerializer
- 全局配置(在
第三步:确保请求格式符合JSON API规范
要么在请求头里设置Accept: application/vnd.api+json,要么在渲染时明确指定格式,这样AMS才会按照JSON API的结构输出included数组。
做完这些调整后,你再调用present region, include: ['courts'](或者带适配器参数的版本),就能同时拿到关联关系和包含完整关联数据的included数组了。
内容的提问来源于stack exchange,提问作者andrefurquin
相关产品推荐
相关产品推荐

