Limitare il numero di di query SQL è uno dei modi migliori per migliorare la performance di un'applicazione Rails, e l'eager loading è probabilmente il modo migliore per farlo.
Supponiamo di trovarci nella seguente situazione molto comune: si ha bisogno di un'applicazione Rails con il model Person. Ogni persona ha più amici (has_many…friends). Cosa si deve fare per trovare gli amici di una persona?
# people_controller.rb def show @person = Person.find(params[:id]) end # show.html.erb <% @person.friends.each do |friend| %> ... <% end %>
Bene, quante query SQL genera questo codice? Se una persona ha 50 amici, allora saranno generate 51 query. Una per la persona e una per ogni amico. Questo è chiamato il problema n+1.
Come si può immaginare la soluzione è l'eager loading. Vediamo come sia vantaggioso usare l'eager loading, basandoci sull'esempio precedente:
# people_controller.rb def show @person = Person.find(params[:id], :include => :friends) end # show.html.erb <% @person.friends.each do |friend| %> ... <% end %>
Il codice sopra genererà solo una query. Perchè? Grazie all'eager loading. L'opzione :include infatti comporterà che la persona e tutti gli amici saranno prelevati nella stessa query SQL.
Quindi aggiungendo esattamente 22 caratteri al nostro codice, si risparmiano un sacco di query per ogni richiesta. Ottimo. Si noti comunque che l'opzione :include è molto più completa di quanto mostrato qui . Si seguito degli indirizzi sui quali poter esplorare meglio le possibilità offerte da questa opzione.
Discussione