2013-03-12 47 views
0

我有三張桌子; Area,MovieMovieArea。在rails中,我希望能夠根據area_id字段Movie查詢MovieArea。然後我想使用Movie中的字段返回複合json對象,並用MovieArea中的值替換相同名稱的字段。如何從這三個模型創建複合JSON對象?

我有以下數據庫結構:

enter image description here

及以下車型:

class Movie < ActiveRecord::Base 
    attr_accessible :title, :synopsis, :grossing, :director, :year, :facts 
    has_many :movie_areas, :class_name => 'MovieArea' 
end 

class Area < ActiveRecord::Base 
    attr_accessible :name 
    has_many :movie_areas, :class_name => 'MovieArea' 
end 

class MovieArea < ActiveRecord::Base 
    attr_accessible :movie_id, :area_id, :synopsis, :facts 

    belongs_to :area, :class_name => 'Area', :foreign_key => :area_id 
    belongs_to :movie, :class_name => 'Movie', :foreign_key => :movie_id 
end 

最後,我一直在試圖使用模型的方法和改變JSON創建該對象響應。在模型中加入:

def grossing 
    self.movie.grossing 
end 
def year 
    self.movie.year 
end 
def title 
    self.movie.title 
end 

等。而在控制器:

@results = MovieArea.where(:area_id => @area.id) 

最後,在視圖:

<%= @results.to_json(:methods => [:grossing, :year, :title]).html_safe -%> 

這工作得很好,我得到JSON的類型我想要的對象:

[ 
    { 
     "id":1, 
     "area_id":1, 
     "movie_id":1, 
     "synopsis":"Area relevant movie synopsis", 
     "facts":"Area relevant movie facts", 
     "grossing":"$9001M", 
     "year":"1999", 
     "title":"Movie title", 
    }, 
    ..... 
] 

所以問題是:有沒有更好的方法來做到這一點?例如,我是否可以從模型中輸出所有內容,並調用如MovieArea.where(:area_id => @area.id).some_function_to_respond?或者我可以將邏輯移動到控制器,因此在視圖中它只需調用@results.to_json()

謝謝!

+1

你看過jbuilder嗎? https://github.com/rails/jbuilder – jvnill 2013-03-12 10:19:33

+0

[RABL](https://github.com/nesquena/rabl)適合生成JSON或XML – shweta 2013-03-12 10:43:58

回答

0

有一個非常新的RailsCasts集涵蓋了你想要做的事情。看看它here

0

我結束了使用RABL - 感謝您的建議shweta。我通過將以下內容添加到我的Gemfile並運行bundle install來安裝它。

gem 'rabl' 
gem 'oj' 

我然後創建以下Rabl的模板movie_areas.json.rablviews/rabl文件夾:

object @movie 
attributes :id, :synopsis, :facts 
glue :movie do 
    attributes :title, :grossing, :director, :year 
end 

以上代碼從movie_area表取idsynopsisfacts然後在titlegrossing增加,來自父母moviedirectoryear

要呈現出來的JSON直接在視圖中,我需要在Backbone.js的使用,我呼籲:

<%= Rabl.render(@results, 'rabl/movie_areas').html_safe -%> 

@results是我的問題和rabl/movie_areas定義的變量ActiveRecord的查詢指movie_areas.json.rabl模板。

以便輸出來自控制器直接一個API,我用:

def movies 
    @area = Area.find_by_slug(params[:slug]) 
    @results = MovieArea.where(:area_id => @area.id) 
    render :inline => Rabl::Renderer.json(@results, 'rabl/movie_areas') 
end 

希望這將幫助別人的未來!