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

时间:2014-12-05 15:31:11

标签: ruby-on-rails json ruby-on-rails-4 rails-activerecord

我有两个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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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
             }