2012-07-26 6 views
5

Ich versuche Will_paginate für eine Rails 3.2 App zu verwenden, und ich habe keine Referenz irgendwo für was passiert, wenn jemand Paging ist, während die Daten in der Datenbank geändert wird . Genauer gesagt, neue Datensätze werden hinzugefügt.Rails will_paginate und Ajax, Paging, während die DB-Tabelle ändert

Ich könnte etwas hier fehlen, aber wenn ich bekomme, wie es funktioniert, Will_paginate einfach zählt die Datensätze in der DB. Angenommen, ich lade eine Seite mit jeweils 5 Datensätzen und möchte, dass sie nach dem neuesten zuerst sortiert werden. Ein Benutzer lädt die Seite und ruft die Datensätze 6-10 (die neuesten Datensätze zu dieser Zeit) ab, die auf Seite 1 angezeigt werden. Dann fügt jemand einen weiteren Datensatz in die Tabelle ein, id = 11. Danach klickt der erste Benutzer auf Seite 2, aber jetzt gibt Seite 2 die Datensätze 2-6. Also hat der Benutzer id = 6 auf beiden Seiten.

Dieses Problem klingt nicht so schlimm, aber es ist wirklich schlecht, wenn man will_paginate Paging für eine unendliche Schriftrolle verwenden mag, wie hier gezeigt: http://railscasts.com/episodes/114-endless-page

ich einen Zeitstempel der ersten Seite zu laden dachte

über das Hinzufügen und übergebe es an aufeinanderfolgende Ajax-Aufrufe, um nach den zuerst vorhandenen Datensätzen zu filtern, um die Duplikate nicht zu erhalten.

Gibt es eine Best-Practice-Methode, um damit umzugehen?

+0

Ich verwendete einen Zeitstempel, um nur die Daten zu erhalten, die zum Zeitpunkt des ersten Ladens der Seite vorhanden waren. – Oded

+0

In diesem Fall sollten Sie in Erwägung ziehen, eine Überprüfung vorzunehmen, ob Datensätze vorhanden sind, die jünger sind als der Zeitstempel. Wenn ja, zeigen Sie einen Link an, damit der Benutzer die neueren Ergebnisse laden kann (siehe z. B. Twitter) Beispiel). – Benissimo

Antwort

1

Ihre Lösung zum Überprüfen des Zeitstempels funktioniert, wenn nur Datensätze hinzugefügt werden. Eine Alternative besteht darin, den Zeitstempel des ältesten zurückgegebenen Datensatzes zu verwenden, um den nächsten Datensatz zu erhalten.

Wenn also ein Datensatz gelöscht wird, wird kein Datensatz übersprungen. Die Verwendung des Zeitstempels des ältesten zurückgegebenen Datensatzes ist auch in der Abfragezeit von Vorteil, da die Datenbank nicht 100 Datensätze auszählen muss, um den 101. Datensatz abzurufen, sondern einfach den ersten Datensatz, der älter als eine bestimmte Zeit ist (Das ist viel schneller, wenn Ihre created_at-Spalte indiziert ist - was die binäre Suche erlaubt.

+0

Hallo @ronalchn können Sie ein Beispiel für Code schreiben, den wir mehr verstehen können ... – medBo