2011-11-28 3 views
7
が含まれています。
render :json => { 
    "playlist" => playlist_description, 
    "songs" => @playlist.songs.as_json(:include => {:playlist_songs => {:only => [:id, :position]}}) 
    } 

上記のコードはデータベースに1 + Nのクエリをもたらし、1つは各曲のplaylist_songsを読み込みます。 プレイリストは@playlistにプリロードされています。Rails:Eager loading as_jsonには、

これは非常に遅いですが、どのように最適化できますか?

答えて

17

私の推測を推測:あなたは、現時点では熱心-ロードplaylist_songsはないです。あなたは現在、as_json呼び出し(すべての曲がロードされてから)を待っています。その後、コードはすべての曲を繰り返し再生し、次にそのプレイリストをフェッチしなければなりません。

私の推測(これは完全にテストされていないバグを含んでいてもよい)

@playlist.songs.all(:include => :playlist_songs).as_json(:include => {:playlist_songs => {:only => [:id, :position]}}) 

AFAICT、このはず最初熱心な負荷すべての曲 playlist_songs ...そしてJSONとしてレンダリングします。

1
render :json => { 
    "playlist" => playlist_description, 
    "songs" => @playlist.songs.all.as_json(:include => {:playlist_songs => {:only => [:id, :position]}}) 
} 

^は

4

rablなどのJSONビルダーとの統合を強くお勧めします。これはあなたの人生を10倍以上に簡単にすることになり、JSON表現の「ビュー」を分離することは非常にうれしいです。私は数ヶ月前にスイッチを入れて、振り返っていない。あなたのコントローラ内の

object @playlist 
attribute :description 
child :playlist_songs do 
    attributes :id, :position 
end 

@playlist = Playlist.where(:id => params[:id]).includes(:playlist_songs) 

その後rablテンプレートはこのようなものかもしれません