Ruby on Rails joins models for json output

风流意气都作罢 提交于 2019-12-10 12:15:30

问题


I'm trying to build a JSON API end point with Ruby on Rails.

I followed the instruction in the following and was able to create JSON API for my models http://railscasts.com/episodes/350-rest-api-versioning?view=comments/

I have the following controller:

/api/v1/movies_controller.rb

class MoviesController < ApplicationController
  def index
    if params[:p].nil?
      p = 1
    else
      p = params[:p].to_i
    end

    @movies = Movie.order("id DESC").page(p)
  end

  def show
    @movie = Movie.find(params[:id])
  end
end

I need to join this with the Genre object where Movie has_many :genres, and Genre belongs_to :movie

However, I'm not able to use the following to get the genres joined with the movie object for the JSON output:

@movie = Movie.find(params[:id], :joins => :genres)

I did notice that the following command is able to generate the joined output in ruby console

@movie.to_json(:include=>:genres)

But then adding this in the controller doesn't show the additional genres fields

Can someone help me please?

Thanks!


回答1:


My advise: Go with active_model_serializers

Add the following line to your Gemfile

gem 'active_model_serializers'

Do a bundle install afterwards.

After that do a

rails g serializer movie
rails g serializer genre

Than customize the following code:

/api/v1/movies_controller.rb

class MoviesController < ApplicationController
  respond_to :json

  def index
    if params[:p].nil?
      p = 1
    else
      p = params[:p].to_i
    end

    @movies = Movie.order("id DESC").page(p)

    respond_with @movies
  end

  def show
    @movie = Movie.find(params[:id])

    respond_with @movie
  end
end

app/serializers/movie_serializer.rb

class MovieSerializer < ActiveModel::Serializer
  embed :ids, :include => true

  attributes :id, :name
  has_many :genres
end

app/serializers/genre_serializer.rb

class GenreSerializer < ActiveModel::Serializer
  embed :ids, :include => true

  attributes :id, :name
end

Have a look at the full documentation of active_model_serializers at https://github.com/rails-api/active_model_serializers



来源:https://stackoverflow.com/questions/17292627/ruby-on-rails-joins-models-for-json-output

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!