2010-11-13 4 views
6

Für eine soziale Netzwerkseite habe ich eine Aktivität von Ereignissen von Personen, denen Sie folgen, und ich möchte ähnliche Arten von Ereignissen innerhalb eines kurzen Zeitrahmens zusammen gruppieren, für mehr kompakte Aktivitätszufuhr Stellen Sie sich vor, wie Facebook eine durch Kommas getrennte Liste anzeigt, wenn Sie mehrere Dinge in schneller Folge "mögen": "Joe mag Bier, Fußball und Chips."So gruppieren Sie ähnliche Elemente in einem Aktivitätsfeed

Ich verstehe die Verwendung der group_by -Methode auf ActiveRecord Enumerable Ergebnisse, aber es muss einige anfängliche Arbeit getan, um eine Eigenschaft zu füllen, die ich später gruppieren kann. Meine Fragen beziehen sich sowohl darauf, Aktivitätsdaten so zu speichern, dass diese Gruppierungen markiert werden können, als auch später wieder abgerufen zu werden.

Im Moment habe ich ein Activity-Modell, das eine Join-Verbindung zwischen dem Benutzer, der die Aktivität festgeschrieben hat, und dem Element, mit dem es verknüpft ist, enthält (in meinem obigen Beispiel nehmen wir "Bier", "Fußball" und "Chips" an) sind Aufzeichnungen eines Like-Modells). Es gibt andere Aktivitätstypen außer "Likes" (Ereignisse, Speichern von Favoriten usw.). Was ich in Betracht ziehe, ist, dass, wenn diese Assoziation erstellt wird, eine Überprüfung durchgeführt wird, wenn die letzte Assoziation dieses Typs gemacht wurde, und wenn sie mehr als eine bestimmte Zeitperiode gemacht wurde, einen Aktivitätsblockzähler, der ein Teil ist, inkrementiert des Aktivitätsmodells. Später, wenn ich diesen Aktivitätsfeed rendere, kann ich nach Benutzer gruppieren, dann tippe, dann diesen Aktivitätsblockzähler.

Beispiel: Angenommen, 2 Blöcke von Aktualisierungen werden am selben Tag erstellt. Ein Benutzer mag 2 Dinge um 2:05 und später 3 Dinge um 5:45. Nachdem das dritte Update (der Start des zweiten Blocks) um 5:45 Uhr stattfindet, erkennt das Modell, dass zu viel Zeit vergangen ist, und inkrementiert seinen Aktivitätsblockzähler um 1, wodurch alle folgenden Aktualisierungen in einen neuen Block gezwungen werden, wenn sie über a gerendert werden 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 

Meine erste Frage: Was ist eine effiziente Möglichkeit, einen Zähler so zu inkrementieren? Es ist nicht mehr auto_increment, also denke ich am einfachsten an den Zähler für den letzten Datensatz als Referenzpunkt. Dies kann jedoch nicht von derselben Abfrage stammen, die beim letzten Update dieses Typs überprüft wurde, da ein späteres Update eines anderen Typs möglicherweise bereits den nächsten Zählerwert erhalten hat. Sie müssen nicht global einzigartig sein, aber das wäre schön.

Die andere Gesamtstrategie, an die ich dachte, war ein anderes Modell namens ActivityBlock, das Gruppen ähnlicher Aktivitäten miteinander verbindet. In vielen Fällen werden Updates jedoch selbst isoliert, so dass es wenig effizient erscheint, einen Datensatz für jede einzelne Aktivität zu erstellen.

Sehen beide wie eine solide Strategie aus?

Meine letzte Frage dreht sich um Seitenumbruch. Da es sich nun um Blöcke handelt, ist es immer schwieriger, immer genau eine bestimmte Anzahl an Einträgen anzuzeigen, bevor die Seitennumerierung beginnt. Entweder ein einzelnes (isoliertes) Aktivitätsupdate oder ein Block von diesem sollte als 1 gezählt werden, also als niedrigstes Ebene meiner group_by, ich kann einen Zähler integrieren, um zu verfolgen, wie viele Zeilen ich angezeigt habe, aber das bedeutet, ich kann nicht nur eine DB-Abfrage mehr machen und einfach eine Limit-Anweisung angeben. Gibt es eine Möglichkeit, dies noch zu tun, ohne wiederholt weitere SQL-Abfragen durchzuführen, bis ich mein Seitenlimit erreicht habe?

Dies wäre ein Vorteil des ActivityBlock-Modell-Ansatzes, da ich problemlos einen Limit-Aufruf darauf anwenden könnte, und Blöcke könnten auch einen Autoinkrement-Zähler enthalten.

+0

Hallo Joost, Können Sie bitte das Datenmodell teilen für was auch immer Sie getan haben? Ich meine, wie speichern Sie die Aktivitäten für jeden Benutzer? Dank – Imran

+0

Jede Entscheidung darüber, was der beste Weg war zu gehen? – MonkeyBonkey

+0

Ich habe dieses Projekt vorerst auf Eis gelegt und habe diesen Aspekt nicht weiter untersucht. –

Antwort

0

Sie konnten die Epoche Zeit, oder eine Variante davon, wie der Zähler da, das ist halb einzigartig und deterministisch

Verwandte Themen