2011-05-27 13 views
7

¿Cuál es la mejor manera de aclarar esta advertencia mientras se mantiene la brevedad de la llamada de caché "obtener o establecer"? Realmente no me gusta tener que hacer un encuentro, a continuación, comprobar si hay nula, a continuación, establecer ...Almacenamiento en memoria caché de raíles: reemplazo de expires_in en Rails.cache.fetch

# DEPRECATION WARNING: Setting :expires_in on read has been deprecated in favor of setting it on write. 

@foo = Rails.cache.fetch("some_key", :expires_in => 15.minutes) do 
    some stuff 
end 
+1

Sólo quieren tener en cuenta que con los carriles 4, hay más de una tendencia hacia el almacenamiento en caché las muñecas rusas en el que no hay tiempo de caducidad es necesario. el tiempo de expiración aún puede ser más fácil, pero a veces esto es un anti-patrón. – mahemoff

+0

Rails 4 no da una advertencia de desaprobación para esa sintaxis. –

Respuesta

5

Me gusta no tener que hacer un encuentro, a continuación, comprobar si hay nula, a continuación, establecer ...

Sí, usted querrá evitar hacerlo en cada llamada, pero usted todavía tiene que hacer eso al menos una vez. Algo tan simple como esto puede funcionar para usted:

def smart_fetch(name, options, &blk) 
    in_cache = Rails.cache.fetch(name) 
    return in_cache if in_cache 
    val = yield 
    Rails.cache.write(name, val, options) 
    return val 
end 

Luego, en sus puntos de vista que puede hacer:

@foo = smart_fetch("some_key") do 
    some stuff 
end 

Tenga en cuenta que el almacenamiento en caché de rieles tiene un tiempo de expiración por defecto se puede establecer cuando se crea, por lo que es posible que no tenga que anularlo en cada llamada a menos que necesite diferentes tiempos de caducidad.

0
+0

btw rails 3.1 lo cambia un poco agregando rack :: cache a la pila predeterminada: https://gist.github.com/958283 – courtsimas

+0

fresh_when y expires_when son métodos de controlador relacionados con la respuesta HTTP; la pregunta es sobre el almacenamiento en caché de datos genéricos sin tener en cuenta los servicios web. – mahemoff

5

pequeñas alteraciones en el método útil proporcionada por @briandoll:

def smart_fetch(name, options = {}, &blk) 
    in_cache = Rails.cache.fetch(name) 
    return in_cache if in_cache 
    if block_given? 
    val = yield 
    Rails.cache.write(name, val, options) 
    return val 
    end 
end 
Cuestiones relacionadas