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.