2011-11-28 12 views
7
render :json => { 
    "playlist" => playlist_description, 
    "songs" => @playlist.songs.as_json(:include => {:playlist_songs => {:only => [:id, :position]}}) 
    } 

Powyższy kod powoduje, że kwerenda 1 + N do bazy danych, jeden ładuje playlist_songs dla każdego utworu. Lista odtwarzania jest wstępnie załadowana w @ playliście.Szyny: Zapotrzebowanie na ładowanie as_json obejmuje

To jest takie powolne, jak mogę zoptymalizować?

Odpowiedz

17

moje przypuszczenie: Nie jesteś chętny-ładowanie playlist_songs w tej chwili. W tej chwili czekasz na wywołanie as_json - po którym wszystkie utwory zostały załadowane - a następnie kod musi przerwać każdy utwór i pobrać playlist_songs.

Domyślam (jest to całkowicie niesprawdzone i może zawierać błędy)

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

AFAICT, powinno pierwszy chętny obciążenie wszystkie utwory i się playlist_songs ... a potem czyni jako JSON.

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

^Chyba

4

Gorąco polecam integrację z konstruktorem JSON, takim jak rabl. Sprawi, że twoje życie będzie 10 razy łatwiejsze do przodu i jest niezwykle miłe oddzielić "widok" od reprezentacji JSON. Zmieniłem parę miesięcy temu i nie oglądałem się za siebie.

ciągu kontrolera:

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

Następnie Rabl szablon może być coś takiego:

object @playlist 
attribute :description 
child :playlist_songs do 
    attributes :id, :position 
end 
Powiązane problemy