我有三張桌子; Area
,Movie
和MovieArea
。在rails中,我希望能夠根據area_id
字段Movie
查詢MovieArea
。然後我想使用Movie
中的字段返回複合json對象,並用MovieArea
中的值替換相同名稱的字段。如何從這三個模型創建複合JSON對象?
我有以下數據庫結構:
及以下車型:
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()
?
謝謝!
你看過jbuilder嗎? https://github.com/rails/jbuilder – jvnill 2013-03-12 10:19:33
[RABL](https://github.com/nesquena/rabl)適合生成JSON或XML – shweta 2013-03-12 10:43:58