class ApplicationController < ActionController::Base
def current_user
User.find(session[:user_id])
end
end
Lo que podemos ver arriba es como el método busca al usuario que se encuentra actualmente logueado. Realiza un find
en el modelo User para el user_id
de la variable de sesión. Este método es llamado varias veces por cada solicitud, lo que conlleva a que se generen varias llamadas a la base de datos por cada solicitud. Este problema puede ser resuelto al cachear el resultado de la llamada a la base de datos en una variable de instancia.
@current_user ||= User.find(session[:user_id])
Lo mas importante a considerar de la línea de arriba es el uso del símbolo OR (||
). La primera vez que la linea de arriba es llamada, la variable @current_user
va a ser nil
y, por lo tanto, se realizara la llamada a la base de datos. Para todas las siguientes llamadas al mismo método, @current_user
va a contener el usuario actual, por lo que la llamada a la base de datos no será realizada. Como consecuencia, habrá una mejora en la performance.
class ApplicationController < ActionController::Base
def current_user
@current_user ||= User.find(session[:user_id])
end
end
La acción actualizada con uso de la variable de instancia.