2010-11-13 18 views
6

Dla witryny sieci społecznościowej mam aktywność wydarzeń od osób, które obserwujesz, i chciałbym grupować podobne typy wydarzeń zrealizowanych w krótkim czasie, aby uzyskać więcej informacji Kompaktowy kanał aktywności. Wyobraź sobie, jak Facebook wyświetla listę rozdzielaną przecinkami, gdy "chcesz" kilka rzeczy w krótkim odstępie czasu: "Joe lubi piwo, piłkę nożną i frytki".Jak pogrupować podobne elementy w strumieniu aktywności

Rozumiem, używając metody group_by w ActiveRecord Enumerable results, ale musi być zrobiona pewna praca początkowa, wypełniająca właściwość, którą mogę pogrupować później. Moje pytania dotyczą zarówno przechowywania danych o działaniach w taki sposób, aby te grupy mogły zostać oznaczone, a następnie odzyskania ich ponownie.

W tej chwili mam model aktywności, który jest połączeniem między użytkownikiem, który popełnił działanie, a elementem, z którym jest połączony (w powyższym przykładzie zakładam "piwo", "futbol" i "żetony" są zapisami modelu Like). Istnieją inne rodzaje aktywności poza "polubieniami" (zdarzenia, zapisywanie ulubionych itp.). Zastanawiam się nad tym, jako że to skojarzenie jest tworzone, sprawdzanie odbywa się, gdy ostatnie powiązanie tego typu zostało wykonane, i jeśli zostało zrobione więcej niż pewien okres temu, zwiększając licznik "bloku aktywności", który jest częścią modelu aktywności. Później, podczas renderowania tego działania, mogę grupować według użytkownika, a następnie wpisać, a następnie ten licznik bloków aktywności.

Przykład: Powiedzmy, że 2 bloki aktualizacji są wykonane w ciągu tego samego dnia. Użytkownik lubi 2 rzeczy o 2:05 i kolejne 3 rzeczy o 5:45. Po trzeciej aktualizacji (początek drugiego bloku) o godzinie 5:45, model wykrywa zbyt długi czas i zwiększa swój licznik bloków aktywności o 1, co wymusza kolejne aktualizacje w nowym bloku, gdy są renderowane przez 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 

Moje pierwsze pytanie: Jaki jest skuteczny sposób na zwiększenie licznika? To już nie jest auto_increment, więc najłatwiej mogę sobie wyobrazić, patrząc na licznik ostatniego rekordu jako punktu odniesienia. Nie może to jednak pochodzić z tego samego zapytania, które zostało sprawdzone podczas ostatniej aktualizacji tego typu, ponieważ późniejsza aktualizacja innego typu mogła już otrzymać następną wartość licznika. Nie muszą być globalnie wyjątkowe, ale byłoby miło.

Inną ogólną strategią, o której pomyślałem, był inny model o nazwie ActivityBlock, który łączy grupy podobnych działań. W wielu przypadkach aktualizacje będą samodzielnie izolowane, więc wydaje się mało wydajne posiadanie jednego rekordu dla każdego pojedynczego działania.

Czy któryś z nich wydaje się być solidną strategią?

Moje ostatnie pytanie dotyczy paginacji. Teraz, gdy mamy do czynienia z blokami, trudniej jest zawsze wyświetlać dokładnie określoną liczbę wpisów przed rozpoczęciem stronicowania. Każda pojedyncza (wyizolowana) aktualizacja aktywności, lub też blok, powinien być liczony jako 1, więc najniższy warstwa z mojej group_by, mogę włączyć licznik do śledzenia liczby wyświetlanych wierszy, ale oznacza to, że nie mogę po prostu utworzyć jednego zapytania DB i po prostu określić instrukcję limit. Czy istnieje sposób, w jaki mógłbym to zrobić bez wielokrotnego wykonywania dodatkowych zapytań SQL, dopóki nie osiągnęłem mojego limitu strony?

Byłaby to jedna z zalet podejścia opartego na modelu ActivityBlock, ponieważ mogłem z łatwością zastosować do tego ograniczenie, a bloki mogły również zawierać automatyczny licznik przyrostu.

+0

Hi Joost, Czy możesz podzielić się model danych dla co masz zrobić? To znaczy, w jaki sposób przechowujesz czynności dla każdego użytkownika? Dzięki – Imran

+0

Każda decyzja o tym, co jest najlepszym sposobem, aby przejść było? – MonkeyBonkey

+0

Na razie wstrzymałem ten projekt i nie eksperymentowałem jeszcze z tym aspektem. –

Odpowiedz

0

Można wykorzystać czas epoka, lub odmianę nim jako licznik od Ów semi-unikalnego i deterministycznej

Powiązane problemy