2012-07-26 7 views
5

Próbuję użyć will_paginate dla aplikacji Rails 3.2 i nie widziałem nigdzie żadnego odniesienia, co dzieje się, gdy ktoś jest stronicowania, podczas gdy dane w db są zmienione . Dokładniej, dodawane są nowe rekordy.Szyny will_paginate i ajax, stronicowania, podczas gdy tabela DB zmienia

Możliwe, że czegoś tu brakuje, ale jeśli rozumiem, jak to działa, to _paginate po prostu zlicza rekordy w DB. Załóżmy, że ładuję stronę z 5 rekordami naraz i chcę, aby były one sortowane przez najnowsze. Użytkownik ładuje stronę i pobiera zapisy 6-10 (najnowsze rekordy w tym czasie) pokazane na stronie 1. Następnie ktoś wstawia inny rekord do tabeli, id = 11. Następnie pierwszy użytkownik klika, aby przejść do strony 2, ale teraz strona 2 podaje zapisy 2-6. Tak więc użytkownik uzyskał id = 6 na obu stronach.

Ten problem nie brzmi tak źle, ale to jest naprawdę źle, jeśli chcesz używać will_paginate stronicowania dla nieskończonego przewijania jak pokazano tutaj: http://railscasts.com/episodes/114-endless-page

myślałem o dodanie znacznika czasu pierwszego ładowania strony i przekazuje go do kolejnych wywołań ajaxowych w celu filtrowania rekordów, które były obecne na początku, aby nie uzyskać duplikatów.

Czy jest jakiś sposób postępowania z najlepszymi praktykami?

+0

Użyłem znacznika czasu, aby uzyskać tylko dane, które były obecne w czasie ładowania pierwszej strony. – Oded

+0

W takim przypadku możesz rozważyć dodanie sprawdzenia, czy są jakieś nowości bardziej aktualne niż znacznik czasu, a jeśli tak, wyświetlić łącze, aby umożliwić użytkownikowi załadowanie bardziej aktualnych wyników (zobacz, jak robi to twitter, dla przykład). – Benissimo

Odpowiedz

1

Twoje rozwiązanie sprawdzania znacznika czasu działa, jeśli tylko zostaną dodane rekordy. Alternatywą jest użycie znacznika czasu najstarszego zwracanego rekordu, aby uzyskać następny zestaw danych.

W ten sposób, jeśli rekord zostanie usunięty, żaden rekord nie zostanie pominięty.

Używanie znacznika czasu najstarszego rekordu jest również korzystne w czasie zapytania, ponieważ baza danych nie musi odliczać 100 rekordów, aby pobrać 101 rekord, może to być proste pobranie pierwszego rekordu starszego niż określony czas (która jest znacznie szybsza, jeśli twoja kolumna created_at jest zindeksowana - umożliwia wyszukiwanie binarne).

+0

hi @ronalchn możesz napisać przykład kodu, który możemy zrozumieć więcej ... – medBo

Powiązane problemy