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

Il codice precedente genera query 1 + N nel database, una per caricare playlist_songs per ogni brano. La playlist è precaricata in @playlist.Rails: Eager caricamento as_json include

Questo è così lento, come posso ottimizzare?

risposta

17

mia ipotesi: Tu non sei ansioso-caricamento dei playlist_songs al momento. Attualmente stai aspettando fino alla chiamata as_json - dopo di che tutte le canzoni sono state caricate - e quindi il codice deve scorrere ogni canzone e recuperare le playlist_songs poi.

mia ipotesi (questo è assolutamente non testato e può includere bug)

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

AFAICT, questo dovrebbe prima carico ansiosi tutte le canzoni e le playlist_songs ... e poi il rendering come JSON.

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

^indovinare

4

Consiglio vivamente l'integrazione con un builder JSON come rabl. Renderà la tua vita 10x più facile andare avanti, ed è estremamente bello separare la "vista" della rappresentazione JSON. Ho fatto il passaggio un paio di mesi fa e non ho guardato indietro.

Entro il controller:

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

Poi il modello Rabl potrebbe essere qualcosa di simile:

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