2010-11-13 18 views
6

Para un sitio de red social, tengo una actividad de eventos de personas a las que sigo, y me gustaría agrupar tipos similares de eventos realizados en un corto período de tiempo juntos, para obtener más alimentación de actividad compacta. Imagine cómo Facebook muestra una lista separada por comas cuando le gustan varias cosas en rápida sucesión: "A Joe le gusta la cerveza, el fútbol y las papas fritas".Cómo agrupar elementos similares en un feed de actividad

Entiendo el uso del método group_by en ActiveRecord Resultados enumerables, pero es necesario que se realice un trabajo inicial rellenando una propiedad que pueda agrupar más tarde. Mis preguntas se relacionan tanto con el almacenamiento de datos de actividad de una manera que estas agrupaciones se pueden marcar, y luego recuperarlas nuevamente.

Ahora tengo un modelo de actividad, que es una asociación de unión entre el usuario que cometió la actividad y el elemento al que está vinculado (en mi ejemplo anterior, asume 'cerveza', 'fútbol' y 'fichas' son registros de un modelo Me gusta). Hay otros tipos de actividades además de "me gusta" (eventos, guardar favoritos, etc.). Lo que estoy considerando es que, a medida que se crea esta asociación, se realiza una comprobación cuando se realizó la última asociación de ese tipo, y si se realizó hace más de un cierto período de tiempo, incrementando un contador de "bloque de actividad" que es parte del modelo de actividad. Más tarde, al renderizar esta actividad, puedo agrupar por usuario, luego escribir, luego este contador de bloque de actividad.

Ejemplo: Digamos que se realizan 2 bloques de actualizaciones dentro del mismo día. A un usuario le gusta 2 cosas a las 2:05 y luego 3 más a las 5:45. Después de que la tercera actualización (el inicio del 2 ° bloque) ocurre a las 5:45, el modelo detecta que ha pasado demasiado tiempo e incrementa su contador de bloque de actividad en 1, forzando las siguientes actualizaciones en un nuevo bloque cuando se procesan a través de un group_by call:

2:05 Joe likes beer nuts and Hooters. 

5:45 Joe likes couches, chips and salsa. 

7:00 Joe is attending the Football Viewing Party At Joe's 

Mi primera pregunta: ¿Cuál es una forma eficiente de incrementar un contador como este? Ya no es autoincremento, así que lo más fácil que puedo pensar es mirar el contador para el último registro como punto de referencia. Sin embargo, esto no podría ser de la misma consulta que se verificó cuando se realizó la última actualización de ese tipo, ya que una actualización posterior de otro tipo ya podría haber recibido el siguiente valor del contador. No tienen que ser globalmente únicos, pero eso sería bueno.

La otra estrategia general que pensé fue otro modelo llamado ActivityBlock, que une grupos de actividades similares. En muchos casos, las actualizaciones estarán aisladas por sí mismas, por lo que parece un poco ineficiente tener un registro para cada actividad individual.

¿Alguna de estas parece una estrategia sólida?

Mi última pregunta gira en torno a la paginación. Ahora que estamos lidiando con bloques, es más difícil mostrar siempre una cierta cantidad de entradas, antes de que comience la paginación. Ya sea una actualización de actividad individual (aislada), o un bloque de entonces, debe contar como solo 1, por lo que al menor capa de mi group_by, puedo incorporar un contador para rastrear cuántas filas he mostrado, pero esto significa que ya no puedo hacer una sola consulta de DB y simplemente especificar una declaración de límite. ¿Hay alguna manera de que pueda hacer esto sin realizar repetidamente consultas SQL adicionales hasta que haya alcanzado el límite de mi página?

Esta sería una ventaja del enfoque del modelo ActivityBlock, ya que podría aplicar fácilmente una llamada de límite a eso, y los bloques también podrían contener un contador de incremento automático.

+0

Hola Joost, Puede por favor compartir el modelo de datos para lo que has hecho? Quiero decir, ¿cómo está almacenando las actividades para cada usuario? Gracias – Imran

+0

Cualquier decisión sobre cuál era el mejor camino a seguir? – MonkeyBonkey

+0

He puesto este proyecto en espera por ahora, y aún no he experimentado con este aspecto en particular. –

Respuesta

0

Se podría utilizar el tiempo época, o una variación de la misma ya que el contador ya que eso es semi-único y determinista

Cuestiones relacionadas