У меня есть три стола; Area
, Movie
и MovieArea
. В рельсах я хочу иметь возможность запросить MovieArea
на основе поля area_id
Movie
. Затем я хочу вернуть составной объект json, используя поля от Movie
и заменяя поля с теми же именами значениями от 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
[RABL] (https://github.com/nesquena/rabl) хорош для генерации JSON или XML – shweta