homeASCIIcasts

1: Cacheo Con Variables de Instancia 

(view original Railscast)

Other translations: En It Fr Kr Pl Pt

Other formats:

Written by Aldo Escudero (aldoescudero.com.ar)

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.