0

3 つのテーブルがあります。AreaMovieおよびMovieArea。Rails で、 のフィールドにMovieArea基づいてクエリできるようにしたい。次に、 のフィールドを使用し、同じ名前のフィールドを の値に置き換えて、複合 json オブジェクトを返したいと思います。area_idMovieMovieMovieArea

次のデータベース構造があります。

ここに画像の説明を入力

そして、次のモデル:

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()か?

ありがとうございました!

4

2 に答える 2

0

あなたがやりたいことをカバーするごく最近の RailsCasts エピソードがあります。こちらをご覧ください

于 2013-03-12T13:02:32.923 に答える
0

私は RABL を使用することになりました - 推薦shwetaに感謝します。以下をGemfileに追加し、実行bundle installしてインストールすることでインストールしました。

gem 'rabl'
gem 'oj'

movie_areas.json.rabl次に、views/rablフォルダに次の RABL テンプレートを作成しました。

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

上記のコードは、テーブルからidsynopsisおよびを取得し、親から、、およびを追加します。factsmovie_areatitlegrossingdirectoryearmovie

backbone.js で使用するために必要な JSON をビューで直接レンダリングするには、次のように呼び出します。

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

@results私の質問で定義された変数 ActiveRecord クエリはどこにあり、テンプレートをrabl/movie_areas参照しています。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

うまくいけば、これは将来誰かを助けるでしょう!

于 2013-03-13T09:22:24.973 に答える