2011-04-18 6 views
8

Tengo la siguiente consulta en mi solicitudcómo almacenar en caché una consulta en Ruby on Rails 3

@categories = Category.joins(:posts).select('distinct categories.*').order('label') 

Esta consulta se carga en cada visita a una página ya que las categorías se muestran en cada página. Esto me parece desordenado ya que la lista de categorías no se actualiza con tanta frecuencia. ¿Hay alguna forma ingeniosa de almacenar en caché solo la consulta? He intentado

Category.cache do 
     @categories = Category.joins(:posts).select('distinct categories.*').order('label') 
    end 

pero todavía veo que la consulta se carga cada vez desde la base de datos en el registro de desarrollo.

+1

almacenamiento en caché está desactivado por defecto en el modo de desarrollo. Busque en 'config/environments/development.rb' para activarlo. –

+1

@Douglas F Shearer Esa configuración controla si las clases de Ruby se almacenan en caché o se vuelven a cargar con cada solicitud, no si la caché de consultas de Active Record está habilitada. –

Respuesta

18

En su controlador, puede intentar algo como:

@categories = Rails.cache.fetch('categories', :expires_in => 24.hours) { Category.joins(:posts).select('distinct categories.*').order('label') } 

que sólo se lea para ver si se ha almacenado en caché los siguientes bloques de datos 'categorías' y que no haya caducado. Si expiró después de 24 horas, consultará el modelo y escribirá el nuevo registro en la memoria caché de Rails.

Para obtener más información, seguí el siguiente guide.

Pruébelo. Lo tengo trabajando de esta manera. Espero que ayude.

+0

Tenga en cuenta que esto solo funciona con ciertas tiendas de memoria caché –

4

Puede usar el almacenamiento en memoria caché de fragmentos para la parte de la plantilla de visualización que muestra las categorías. Esto significa que las categorías se servirán desde la tienda de caché y la consulta solo se ejecutará una vez hasta que caduque (mediante el método expire_fragment).

+0

Dado que el almacenamiento en memoria caché de fragmentos utiliza el almacenamiento en memoria caché de muñecas rusas, es más fácil presentar una vista coherente de los datos que la solución provista en http://stackoverflow.com/a/5712011/61048 , que puede estar desactualizado con los datos subyacentes dentro de las 24 horas o debe invalidarse explícitamente. –

Cuestiones relacionadas