class ApplicationController < ActionController::Base
def current_user
User.find(session[:user_id])
end
end
Il metodo precedente recupera l’utente correntemente autenticato.
Invoca una find sulla classe di modello User
filtrando con lo user_id di sessione.
Questo metodo è invocato diverse volte per ogni singola richiesta, il che significa che vengono inoltrate altrettante richieste (SELECT) al database.
Questo problema prestazionale può essere risolto facendo cache, su di una variabile di istanza, del risultato ottenuto dal database con la prima richiesta.
@current_user ||= User.find(session[:user_id])
La cosa importante da notare è l’operatore di assegnamento in OR fornito da Ruby.
La prima volta che il flusso di esecuzione passa dalla riga di codice qui sopra, la variabile di istanza @current_user è ancora non valorizzata (vale nil), per cui
viene eseguito il codice alla destra dell’operatore di assegnamento ||= e viene effettivamente inoltrata una richiesta al database.
Per tutte le successive chiamate del metodo current_user, la variabile @current_user sarà già valorizzato con l’istanza che rappresenta l’utente corrente, per cui non verrà inoltrata alcuna ulteriore richiesta al database.
Ciò aumenterà le performance dell’applicazione.
class ApplicationController < ActionController::Base
def current_user
@current_user ||= User.find(session[:user_id])
end
end
L’azione aggiornata per l’utilizzo di variabile di istanza.