2010-11-13 9 views
6

Pour un site de réseau social, j'ai une activité d'événements de personnes que vous suivez, et je voudrais regrouper des types d'événements similaires réalisés dans un court laps de temps, pour plus d'informations. alimentation d'activité compacte. Imaginez comment Facebook affiche une liste séparée par des virgules lorsque vous «aimez» plusieurs choses en succession rapide: «Joe aime la bière, le football et les frites». Je comprends l'utilisation de la méthode group_by sur les résultats ActiveRecord Enumerable, mais un travail initial doit être effectué pour remplir une propriété que je peux regrouper plus tard. Mes questions traitent à la fois du stockage des données d'activité de manière à ce que ces regroupements puissent être marqués, puis de leur récupération ultérieure.Comment regrouper des éléments similaires dans un flux d'activité

Maintenant j'ai un modèle d'activité, qui est une association de jointure entre l'utilisateur qui a commis l'activité et l'élément auquel il est lié (dans mon exemple ci-dessus, supposons 'bière', 'football' et 'chips' sont des enregistrements d'un modèle Like). Il y a d'autres types d'activités en plus des 'j'aime' (événements, sauvegarde des favoris, etc.). Ce que je considère est, que cette association est créée, une vérification est faite quand la dernière association de ce type a été faite, et si elle a été faite plus d'une certaine période il y a, incrémenter un compteur 'bloc d'activité' qui fait partie du modèle d'activité. Plus tard, lors du rendu de cette activité, je peux regrouper par utilisateur, puis taper, puis ce compteur de bloc d'activité.

Exemple: Supposons que 2 blocs de mises à jour sont effectués le même jour. Un utilisateur aime 2 choses à 2h05 et plus tard 3 autres choses à 5:45. Après la troisième mise à jour (le début du 2ème bloc) à 5:45, le modèle détecte que trop de temps s'est écoulé et incrémente son compteur de blocs d'activité de 1, forçant ainsi toutes les mises à jour suivantes dans un nouveau bloc. group_by appel:

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 

Ma première question: Quelle est un moyen efficace d'incrémenter un compteur comme celui-ci? Ce n'est plus auto_increment, donc la chose la plus simple que je puisse penser est de regarder le compteur pour le dernier enregistrement comme point de référence. Toutefois, cela ne peut pas provenir de la même requête vérifiée lors de la dernière mise à jour de ce type, car une mise à jour ultérieure d'un autre type aurait déjà reçu la valeur du compteur suivante. Ils ne doivent pas être uniques au monde, mais ce serait bien.

L'autre stratégie globale à laquelle je pensais était un autre modèle appelé ActivityBlock, qui regroupe des groupes d'activités similaires. Dans de nombreux cas, les mises à jour seront isolées par elles-mêmes, donc cela semble un peu inefficace d'avoir un enregistrement pour chaque activité individuelle.

Est-ce que l'un ou l'autre semble être une stratégie solide?

Ma dernière question tourne autour de la pagination. Maintenant que nous avons affaire à des blocs, il est plus difficile de toujours afficher exactement un certain nombre d'entrées, avant que la pagination ne se déclenche. Une mise à jour d'activité individuelle (isolée) ou un bloc de alors devrait compter 1, donc au plus bas couche de mon groupe_by, je peux incorporer un compteur pour suivre le nombre de lignes que j'ai affichées, mais cela signifie que je ne peux plus faire une seule requête DB et simplement spécifier une instruction limite. Est-il possible que je puisse toujours le faire sans effectuer à plusieurs reprises des requêtes SQL supplémentaires jusqu'à ce que j'ai atteint la limite de ma page? Ceci constituerait un avantage de l'approche du modèle ActivityBlock, puisque je pourrais facilement y appliquer un appel de limite, et les blocs pourraient aussi contenir un compteur d'incrémentation automatique.

+0

Salut Joost, Pouvez-vous s'il vous plaît partager le modèle de données pour tout ce que vous avez fait? Je veux dire comment stockez-vous les activités pour chaque utilisateur? Merci – Imran

+0

Toute décision sur ce que la meilleure façon d'aller était? – MonkeyBonkey

+0

J'ai mis ce projet en attente pour le moment, et je n'ai pas encore expérimenté cet aspect particulier. –

Répondre

0

Vous pouvez utiliser le temps d'époque, ou une variante de celui-ci comme le compteur depuis des thats semi-unique et déterministe

Questions connexes