2012-07-26 14 views
5

Sto provando a usare will_paginate per un'applicazione Rails 3.2 e non ho visto alcun riferimento da nessuna parte per quello che succede quando qualcuno sta pagando mentre i dati nel db sono cambiati . Più in particolare, vengono aggiunti nuovi record.Rails will_paginate e ajax, paging mentre la tabella DB cambia

Potrei mancare qualcosa qui, ma se capisco come funziona, will_paginate conta semplicemente i record nel DB. Diciamo che carico una pagina con 5 record alla volta e li voglio ordinati per il più recente prima. Un utente carica la pagina e ottiene i record 6-10 (i record più recenti in quel momento) mostrati alla pagina 1. Quindi, qualcuno inserisce un altro record nella tabella, id = 11. Successivamente, il primo utente fa clic per andare alla pagina 2, ma ora la pagina 2 fornisce i record 2-6. Quindi l'utente ha ottenuto id = 6 in entrambe le pagine.

Questo problema non suona così male, ma in realtà è male se si desidera utilizzare il paging will_paginate per un rotolo infinito come illustrato di seguito: http://railscasts.com/episodes/114-endless-page

ho pensato di aggiungere un timestamp della prima caricamento della pagina e passarlo a chiamate Ajax consecutive per filtrare i record che erano presenti all'inizio per non ottenere i duplicati.

Esiste un modo migliore per gestirlo?

+0

Ho utilizzato un timestamp per ottenere solo i dati che erano presenti al momento del caricamento della prima pagina. – Oded

+0

In questo caso, potresti voler aggiungere un controllo per verificare se ci sono dei record più recenti rispetto al timestamp e, in tal caso, visualizzare un link per consentire all'utente di caricare i risultati più recenti (vedi come fa Twitter, per esempio). – Benissimo

risposta

1

La soluzione di controllo del timestamp funziona se i record vengono aggiunti solo. Un'alternativa è utilizzare il timestamp del record più vecchio restituito per ottenere il successivo set di dati.

In questo modo, se un record viene eliminato, non verrà saltato alcun record.

L'utilizzo del timestamp del record più vecchio restituito è anche vantaggioso in termini di tempo di query, poiché il database non ha bisogno di contare fino a 100 record per recuperare il record 101st, potrebbe semplicemente recuperare il primo record più vecchio di un certo tempo (che è molto più veloce se la tua colonna created_at è indicizzata - permettendo la ricerca binaria).

+0

hi @ronalchn puoi scrivere un esempio di codice che possiamo capire di più ... – medBo