Rails API模式下show动作如何同时返回两组JSON数据
正确实现方案
方案1:平级返回两组独立数据
如果需要前端分别拿到post主数据和post_items关联数据,直接将两组数据封装到同一个Hash中单次render即可:
def show post = Post.find(params[:id]) render json: { post: post, post_items: post.post_items }, status: :ok end
方案2:嵌套返回关联数据
如果需要post_items作为post的嵌套属性返回,使用Rails内置的include参数即可:
def show post = Post.find(params[:id]) render json: post, include: :post_items, status: :ok end
性能优化建议
查询时预先加载关联数据,避免产生N+1查询问题:
def show # 预先加载post_items,仅触发两次SQL查询 post = Post.includes(:post_items).find(params[:id]) render json: { post: post, post_items: post.post_items }, status: :ok end
旧方案报错原因说明
- 两次调用
render json触发AbstractController::DoubleRenderError:Rails规定单个Controller动作仅可执行一次render/redirect操作,且调用render后不会自动终止后续代码执行,多次调用必然报错。 respond_to方法不存在:Rails API模式默认未引入responders模块,即使引入该模块,同格式下定义多个format.json也只会执行第一个,无法实现同时返回两组数据的需求。
内容的提问来源于stack exchange,提问作者Beginner Professional
相关产品推荐
相关产品推荐

