0

У меня есть три стола; Area, Movie и MovieArea. В рельсах я хочу иметь возможность запросить MovieArea на основе поля area_idMovie. Затем я хочу вернуть составной объект json, используя поля от Movie и заменяя поля с теми же именами значениями от 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

+0

[RABL] (https://github.com/nesquena/rabl) хорош для генерации JSON или XML – shweta

ответ

0

Существует очень недавний эпизод RailsCasts, охватывающий то, что вы хотели бы сделать. Посмотрите на это here

0

Я закончил использовать RABL - спасибо за рекомендацию shweta. Я установил его, добавив следующее в свой Gemfile и запустив bundle install, чтобы установить его.

gem 'rabl' 
gem 'oj' 

Затем я создал следующий шаблон RABL movie_areas.json.rabl в папке views/rabl:

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

Приведенный выше код принимает id, synopsis и facts из movie_area таблицы, а затем добавляет в title, grossing, director и year от родителя movie.

Чтобы сделать из JSON прямой в целях, которые я требуется для использования в Backbone.js, я называю:

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

@results Где переменная запроса ActiveRecord определяется в моем вопросе и rabl/movie_areas относится к movie_areas.json.rabl шаблон.

Для вывода непосредственно от контроллера для АНИ, я использую:

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 

Надеюсь, это поможет кому-то в будущем!