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

El código anterior da como resultado 1 + N consultas a la base de datos, una para cargar playlist_songs para cada canción. La lista de reproducción está precargada en @playlist.Rieles: Ansioso de cargar as_json incluye

Esto es tan lento, ¿cómo puedo optimizar?

Respuesta

17

Mi opinión: No estás ansioso cargar los playlist_songs en este momento. Actualmente estás esperando hasta la llamada as_json, después de la cual se han cargado todas las canciones, y luego el código tiene que iterar sobre cada canción y luego buscar los playlist_songs.

Mi conjetura (esto es totalmente probado y puede incluir insectos)

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

AFAICT, esto debería primera carga ansiosa todas las canciones y los playlist_songs ... y luego hacer como JSON.

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

^supongo

4

Recomiendo encarecidamente la integración con un constructor JSON como rabl. Hará que su vida sea 10 veces más fácil para avanzar, y es extremadamente agradable separar la "vista" de la representación JSON. Hice el cambio hace un par de meses y no he mirado hacia atrás.

Dentro de su controlador:

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

A continuación, la plantilla Rabl podría ser algo como esto:

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