在 Rails 控制器中将多个查询呈现为 json

Posted

技术标签:

【中文标题】在 Rails 控制器中将多个查询呈现为 json【英文标题】:render multiple queries as json in rails controller 【发布时间】:2015-02-03 19:49:10 【问题描述】:

我有两个 Rails 控制器操作:

  def show
    @project = Project.find(params[:id])
    render json: @project,
      :only => [:id, :compilation_id],
      :methods => :track_name,
      :include => 
        :user =>  :only => [:id, :email] 
      
  end

  def list_users
    render json: User.select(:id, :email)
  end

我想在一个响应中同时呈现它们。这样做的最佳方法是什么?我尝试使用to_json 描述的here 方法,但我读到该方法已被弃用,我还注意到它转义了似乎不必要的内容。任何帮助表示赞赏。

【问题讨论】:

答案解决了你的问题吗? @dgilperez- 不,您的回答没有解决在一个响应中渲染两个模型的问题。不过,这些信息很有用,我给了你一个赞成票。 试试jbuilder,我一直用它来渲染复杂的json响应。 【参考方案1】:

对于需要足够复杂的 json 结构以使 to_json 看起来可读的情况,我建议使用 active_model_serializers gem。

然后你可以像这样定义两个序列化器类:

class ProjectSerializer < ActiveModel::Serializer
  attributes :id, :compilation_id

  has_many :users
end

class UserSerializer < ActiveModel::Serializer
  attributes :id, :email
end

然后在你的控制器中:

class ProjectsController < ApplicationController
  def show
    @project = Project.find(params[:id])
    render json: @project, serializer: ProjectSerializer, status: 200
  end
end

作为奖励曲目,你甚至可以cache the response!

【讨论】:

【参考方案2】:

当然,解决方案非常简单:

project = Project.select(:id, :compilation_id, :user_id, :genre_id, :ordering).find(params[:id])
render json:  :project => project,
               :users => User.select(:id, :email),
               :genres => Genre.select(:id, :name),
               :track_name => project.track_name
             

【讨论】:

以上是关于在 Rails 控制器中将多个查询呈现为 json的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中控制器的一个操作中呈现不同的布局和 json 数据?

在 Rails 中,如何使用视图呈现 JSON?

无法在 Rails 5 中将 Json 数据获取到 Ajax

响应多个 JSON 渲染。 (红宝石/导轨)

将rails多态关联对象渲染为JSON

如何在 Rails 中将 Javascript 对象转换为 JSON?