2011-01-08 14 views
11

en Ruby on Rails se puede encontrar los registros de la base de datos con la siguiente sintaxis:Ruby on Rails: Cómo configurar "encontrar" opciones con el fin de no utilizar la memoria caché

<model_name>.find_by_<field_name>() 

Ejemplos: User.find_by_email('[email protected]'), User.find_by_id(1),. ..

Hace un tiempo, si no estoy equivocado, leí en alguna parte que se puede deshabilitar explícitamente el almacenamiento en caché para las operaciones 'buscar', pero no recuerdo cómo.

¿Alguien me puede ayudar a recordar?

+0

No he visto la configuración de caché por defecto ... ¿Está seguro? revisaste tus registros? – apneadiving

+0

Estoy de acuerdo con el apneadiving. No creo que esté en la memoria caché por defecto. –

Respuesta

18

Puede utilizar ActiveRecord::QueryCache.uncached así:

User.find_by_email('[email protected]') 
User.find_by_email('[email protected]') # Will return cached result 

User.uncached do 
    User.find_by_email('[email protected]') 
    User.find_by_email('[email protected]') # Will query the database again 
end 

En un controlador, se vería algo como esto:

def show # users#index action 
    User.uncached do 
    @user = User.find_by_email('[email protected]') 
    @another_user = User.find_by_email('[email protected]') # Will query database   
    end 

    User.find_by_email('[email protected]') # Will *not* query database, as we're outside of the Users.uncached block 
end   

Obviamente, en un modelo, sólo hay que hacer:

class User < ActiveRecord::Base 
    def self.do_something 
    uncached do 
     self.find_by_email('[email protected]') 
     self.find_by_email('[email protected]est') # Will query database 
    end 
    end 
end 

User.do_something # Will run both queries 
+0

No entendí cómo usar estos códigos: ¿qué tengo que poner en lugar de 'self.find (...)'? ¿Puedes hacer un ejemplo práctico? – user502052

+0

He actualizado mis ejemplos, pero es difícil cuando me está dando código abstracto. ¿Desea usar esto en un controlador o en un modelo? Si el controlador, puede usar mi primer ejemplo. Si es modelo, puede usar mi último. Puede ser más fácil si publicas lo que estás tratando de hacer, en lugar de intentar encontrar ejemplos que tengan sentido para ti. – vonconrad

+0

Muchas gracias. – user502052

2

(Nota:. Rails3 asumiendo, desde Rails2 no tiene almacenamiento en caché por defecto)

Esto debería funcionar como quiera que al sacarlo de la caja:

  1. Consultas cachés son destruidas después de cada acción (http://guides.rubyonrails.org/caching_with_rails.html párrafo 1.5)
  2. Además, parece (http://ryandaigle.com/articles/2007/2/7/what-s-new-in-edge-rails-activerecord-explicit-caching) que se almacena en caché también se destruyen en las actualizaciones de atributos/registros

¿Tiene un caso de uso específico no cubierto por la configuración predeterminada?

+0

Estoy tratando de resolver este problema de alguna manera: http://stackoverflow.com/questions/4636704/chache-problem-running-two-consecutive-http-get-requests-from-an-app1-to-an-app2 – user502052