Pregunta

Tengo una página de perfil de usuario que tiene una barra lateral con estadísticas de usuario como no muy diferentes a la página de perfil de desbordamiento de pila (por ejemplo, visitas totales, número de insignias).

El problema es que actualmente estoy presionando la base de datos y calculando estas estadísticas con cada solicitud. Puedo implementar el almacenamiento en caché de fragmentos para reducir esto, pero ¿hay una mejor manera de manejar este tipo de cosas?

Almacenar los datos de resumen agregados en la base de datos parece que podría conducir a problemas (es decir, inconsistencia).

¿Fue útil?

Solución

Puede almacenar esta información en la base de datos en lugar de recalcularla, utilizando:

  1. Enchufado de contador
  2. Devoluciones de llamada personalizadas

Enchufado de contador

Como ejemplo, si mide el número de insignias, puede crear un campo de base de datos en User llamó badges_count, luego en el modelo de insignia, tener belongs_to :user, :counter_cache => true. Ahora, cada vez que cambia el número de insignias, puede acceder al recuento sin ningún cálculo nuevo en @user.badges_count.

Una implementación básica: http://asciicasts.com/episodes/23-counter-cache-column

Devoluciones de llamada personalizadas

Supongamos que tiene un campo que mide el comportamiento que es más complejo que un recuento simple. En este caso, simplemente implemente devoluciones de llamada que actualicen un campo cada vez que ocurre una determinada acción usando before_save, after_save, before_create, etc.

Preocupaciones sobre la inconsistencia

Almacenar los datos en su base de datos solo será inconsistente si lo está haciendo mal. Hay un número finito de rutas a través de las cuales se puede actualizar cualquier estadística, y debe asegurarse de que todas las rutas estén cubiertas para actualizar el campo que esté utilizando. Rails lo hace por usted con contador_caching, y debe hacerlo usted mismo si usa devoluciones de llamada personalizadas o tiene alguna situación inusual.

Otros consejos

Podrías usar un div oculto como en esta pregunta (Almacenamiento en caché de datos utilizando divs ocultos). Dependiendo de la cantidad de datos que desee almacenar en caché, esta podría ser una buena solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top