2010-11-13 11 views
6

Per un sito di social network, ho un'attività di eventi da persone che segui e vorrei raggruppare tipi simili di eventi realizzati in un breve lasso di tempo insieme, per un altro alimentazione di attività compatta. Immagina come Facebook mostri una lista separata da virgole quando ti "piacciono" diverse cose in rapida successione: "A Joe piacciono la birra, il calcio e le patatine".Come raggruppare elementi simili in un feed di attività

Capisco di usare il metodo group_by su ActiveRecord. I risultati enumerabili, ma è necessario che ci sia qualche lavoro iniziale che compila una proprietà che posso raggruppare più tardi. Le mie domande riguardano sia l'archiviazione dei dati di attività in modo che questi gruppi possano essere contrassegnati, sia successivamente recuperarli di nuovo.

In questo momento ho un modello di attività, che è un'associazione di join tra l'utente che ha impegnato l'attività e l'elemento a cui è collegato (nel mio esempio sopra, supponiamo "birra", "calcio" e "chip" sono record di un modello Like). Esistono altri tipi di attività oltre ai "Mi piace" (eventi, salvataggio dei preferiti, ecc.). Quello che sto considerando è che, quando questa associazione viene creata, viene fatto un controllo quando è stata fatta l'ultima associazione di quel tipo e se è stata fatta più di un certo periodo di tempo fa, incrementando un contatore 'blocco attività' che è parte del modello di attività. Successivamente, durante il rendering di questo feed di attività, posso raggruppare per utente, quindi digitare, quindi questo contatore di blocchi attività.

Esempio: diciamo che 2 blocchi di aggiornamenti sono effettuati nello stesso giorno. A un utente piacciono 2 cose alle 2:05 e successivamente altre 3 cose alle 5:45. Dopo che il terzo aggiornamento (l'inizio del 2 ° blocco) è avvenuto alle 5:45, il modello rileva che è passato troppo tempo e incrementa di 1 il suo contatore di blocchi attività, forzando quindi tutti gli aggiornamenti successivi in ​​un nuovo blocco quando vengono resi tramite 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 

La mia prima domanda: quale è un modo efficace per incrementare un contatore come questo? Non è più autoincremento, quindi la cosa più semplice che riesco a pensare è guardare il contatore dell'ultimo record come punto di riferimento. Tuttavia, questo non può essere ottenuto dalla stessa query verificata quando è stato effettuato l'ultimo aggiornamento di quel tipo, poiché un successivo aggiornamento di un altro tipo potrebbe aver già ricevuto il successivo valore contatore. Non devono essere globalmente unici, ma sarebbe bello.

L'altra strategia generale che ho pensato era un altro modello chiamato ActivityBlock, che unisce insieme gruppi di attività simili. In molti casi, tuttavia, gli aggiornamenti saranno isolati da soli, quindi sembra un po 'inefficiente avere un record per ogni singola attività.

Uno di questi sembra una strategia solida?

La mia domanda finale ruota attorno all'impaginazione. Ora che abbiamo a che fare con i blocchi, è sempre più difficile visualizzare sempre una certa quantità di voci, prima che la paginazione entri in gioco. O un singolo aggiornamento di attività (isolato), o un blocco di allora dovrebbe contare come solo 1, quindi al minimo livello del mio gruppo_by, posso incorporare un contatore per tenere traccia di quante righe ho visualizzato, ma ciò significa che non posso più creare una query DB e semplicemente specificare un'istruzione limit. C'è un modo in cui potrei continuare a farlo senza eseguire ripetutamente query SQL aggiuntive fino a quando non avrò raggiunto il limite della mia pagina?

Questo sarebbe un vantaggio dell'approccio del modello ActivityBlock, poiché potrei facilmente applicare una chiamata limite a tale, ei blocchi potrebbero contenere anche un contatore di incremento automatico.

+0

Hi Joost, ti invitiamo a condividere il modello di dati per tutto ciò che avete fatto? Voglio dire come si memorizzano le attività per ciascun utente? Grazie – Imran

+0

Qualsiasi decisione su ciò che il modo migliore per andare è stato? – MonkeyBonkey

+0

Per ora ho sospeso questo progetto e non ho ancora sperimentato questo aspetto particolare. –

risposta

0

Si potrebbe utilizzare il tempo di un'epoca, o una variante di esso come il contatore in quanto questo è semi-unico e deterministica