You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails API的JSON响应中显示所有关联项

在Rails API中一次请求返回Todo及其所有关联Item的方法

嘿,我来帮你搞定这个问题!你当前的代码只会返回单个Todo的基础数据,要把它关联的所有Item一起返回的话,其实很简单,分两步来就行:

1. 预加载关联数据(避免N+1查询)

首先优化你的set_todo方法,用includes预加载关联的items,这样能避免查询完Todo后又逐个查询每个Item的性能问题:

def set_todo
  @todo = Todo.includes(:items).find(params[:id])
end

2. 序列化时包含关联项

接下来要让JSON响应里带上items数据,根据你用的序列化方式,有几种不同的实现:

方式一:直接用Rails内置的序列化

如果你的json_response方法是封装了render json:的逻辑,直接在返回时指定include: :items即可:

def show
  render json: @todo, include: :items
end

或者如果json_response是接收对象并调用to_json的话,改成:

def show
  json_response(@todo.as_json(include: :items))
end

方式二:自定义返回字段

如果你只想返回Item的部分字段(比如只返回id和name),可以这样写:

render json: @todo, include: { items: { only: [:id, :name] } }

方式三:用序列化器(比如ActiveModelSerializers)

如果项目里用了序列化器,只需要在TodoSerializer里声明关联的items即可:

class TodoSerializer < ActiveModel::Serializer
  attributes :id, :title, :created_by
  has_many :items
end

这样当你返回@todo时,序列化器会自动把关联的items包含进去。

这样修改之后,访问你的Todo详情接口时,返回的JSON就会包含该Todo下的所有Item数据啦!

内容的提问来源于stack exchange,提问作者jesica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:43:09