6

He configurado el almacenamiento en caché de acción (con barrenderos, pero supongo que eso es irrelevante aquí) en mi aplicación, y hasta ahora funciona muy bien excepto por una cosa:rieles de almacenamiento en caché: caducidad múltiples páginas para una acción

I use Kaminari para la paginación, y así cuando ejecuto expire_action en mi acción solo vence la primera página. Como sé que el almacenamiento en caché no funcionará cuando utilice la cadena de consulta para especificar la página, configuré una ruta para que las páginas se anexen al final de la url (por ejemplo,/people/123/page/2).

Añadiré más información a esta publicación si es necesario, pero supongo que hay algo obvio que me falta aquí, entonces: ¿Alguien sabe cómo caducar el resto de mis páginas?

+0

Lo que funcionaría igual de bien sería si pudiera excluir cualquier cosa que no sea la primera página de indización, ya que nadie cerca verá las siguientes páginas ... – rogerkk

Respuesta

5

Todavía estoy interesado en una respuesta a mi pregunta original y cambiaré mi respuesta aceptada si surge una solución. Dicho esto, terminé solo en el caché de la página original comprobando si se había especificado una página:

caches_action: index,: if => Proc.new {params [: page] .nil? }

+0

nice logic, bro – Mukesh

+0

Otra solución para ese caso es usar Opción 'cache_path' .. http://stackoverflow.com/a/2166419/1297435 –

1

He aquí una solución en la que he pensado enfrentar el mismo problema, aunque aún no lo haya implementado. Guarde el tiempo de caducidad real en su propia clave. La clave sería una representación canónica de la URL de búsqueda, es decir, sin el parámetro "página". e.g .:

El usuario busca en http://example.com?q=foo&page=3, entonces params es { q: 'foo', page: 3 }. Elimina "página = 3" y nos queda {q: 'foo'}.

Ejecute to_param en él y agregue un prefijo, y nos quedará una clave de caché como search_expiry_q=foo.

Buscar caché para esta consulta canónica, es decir, Rails.cache.read (search_expiry_q=foo). Si existe, haremos que nuestro resultado caduque en este momento. Desafortunadamente, solo tenemos expires_in, no expires_at, así que tendremos que hacer un cálculo. es decir, algo así como expires_in: expiry_time - Time.now - 5.seconds (los 5 segundos con suerte previenen cualquier condición de carrera). Almacenamos el URL/params completo de esta manera.

OTOH si no hay vencimiento, entonces nadie ha realizado la búsqueda recientemente. Por lo que hacemos:

expiry_time = Time.now + 1.hour 
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour) 

y la memoria caché este fragmento/página, de nuevo con la URL completa/params y expires_in: 1.hour.

Cuestiones relacionadas