Como agrupar itens semelhantes em um feed de atividades

Para um site de rede social, tenho uma atividade de eventos de pessoas que você segue e gostaria de agrupar tipos semelhantes de eventos feitos em um curto período de tempo, para um feed de atividades mais compacto. Imagine como o Facebook exibe uma lista separada por vírgulas quando você 'gosta' de várias coisas em rápida sucessão: 'Joe gosta de cerveja, futebol e batatas fritas'.

Eu entendo o uso do método group_by nos resultados Enumeráveis do ActiveRecord, mas é preciso haver algum trabalho inicial concluído preenchendo uma propriedade que eu possa agrupar posteriormente. Minhas perguntas lidam com o armazenamento de dados de atividades de maneira que esses agrupamentos possam ser marcados e, posteriormente, recuperados novamente.

No momento, tenho um modelo de atividade, que é uma associação de junção entre o usuário que confirmou a atividade e o item ao qual está vinculada (no meu exemplo acima, assuma que 'cerveja', 'futebol' e 'chips' são registros de um Como modelo). Além de 'curtidas', existem outros tipos de atividades (eventos, salvando favoritos etc.). O que eu estou considerando é que, quando essa associação é criada, é feita uma verificação quando a última associação desse tipo foi feita e, se foi feita há mais de um determinado período, incrementando um contador de 'bloco de atividades' que faz parte do modelo de atividade. Mais tarde, ao renderizar esse feed de atividades, posso agrupar por usuário, digitar e, em seguida, esse contador de blocos de atividades.

Exemplo: Digamos que dois blocos de atualizações sejam feitos no mesmo dia. Um usuário gosta de 2 itens às 2:05 e mais tarde de 3 itens às 5:45. Depois que a terceira atualização (o início do 2º bloco) acontece às 5:45, o modelo detecta muito tempo e incrementa seu contador de blocos de atividades em 1, forçando as atualizações a seguir em um novo bloco quando elas são renderizadas por meio de um chamada group_by:

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

Minha primeira pergunta: qual é uma maneira eficiente de incrementar um contador como esse? Não é mais auto_increment, então a coisa mais fácil que consigo pensar é olhar o contador para o último registro como um ponto de referência. No entanto, isso não poderia ser da mesma consulta que verificou quando a última atualização desse tipo foi feita, pois uma atualização posterior de outro tipo já poderia ter recebido o próximo valor do contador. Eles não precisam ser globalmente únicos, mas isso seria bom.

A outra estratégia geral em que pensei foi outro modelo chamado ActivityBlock, que une grupos de atividades semelhantes. Em muitos casos, as atualizações serão isoladas por si mesmas, portanto, parece um pouco ineficiente ter um registro para cada atividade individual.

Algum destes parece uma estratégia sólida?

Minha pergunta final gira em torno da paginação. Agora que estamos lidando com blocos, é mais difícil exibir sempre exatamente uma certa quantidade de entradas, antes que a paginação comece. Uma atualização de atividade individual (isolada) ou um bloco devem contar como apenas 1, portanto, no mínimo Na camada do meu group_by, posso incorporar um contador para rastrear quantas linhas exibi, mas isso significa que não posso mais fazer uma consulta ao banco de dados e simplesmente especificar uma declaração de limite. Existe alguma maneira de eu ainda fazer isso sem executar repetidamente consultas SQL adicionais até atingir meu limite de páginas?

Essa seria uma vantagem da abordagem do modelo ActivityBlock, já que eu poderia aplicar facilmente uma chamada de limite a ela, e os blocos também poderiam conter um contador de incremento automático.

questionAnswers(2)

yourAnswerToTheQuestion