Korzystając z 254 Railscasta dot. paginacji z pomocą Kaminari, natknąłem się na problem paginacji tablic. Dawniej korzystałem z WillPagination i tworzyłem sobie instancję tego obiektu, wrzucając co mi tam trzeba. Paginowało ładnie. Niestety czasy się zmieniają i przyszło mi korzystać z Kaminari (które nawiasem mówiąc jest dużo wygodniejsze). Kaminari dodaje tylko scope'y - tak więc z definicji nie obsługuje niczego innego niż ActiveRecord.
Aby obejść ten problem, przygotowałem małe rozszerzenie klasy Array. Z racji tego, że paranoją byłoby ładować do tablicy wszystko (załóżmy że danych jest duuuużo), rozszerzenie to, działa na już "skróconym" (czy też zpaginowanym) zbiorze. Przykład:
Mamy 100 linijek tekstu, chcemy wyświetlać po 10 i skorzystać z paginacji. Wybieramy więc interesującą nas stronę:
@pagin_lines = @lines[20, 10] @total_lines = @lines.count @total_lines.paginable(3, 10, @total_lines)
I tyle. Parametry są następujące:
- page - na której stronie jesteśmy (którą stronę wyświetlamy),
- per_page - ile elementów na stronie,
- total_elements_amount - ile jest łącznie elementów.
I to by było na tyle. Cały kod też nie jest skomplikowany:
# Rozszerzenie klasy Array umożliwiające korzystanie z paginacji za pomocą # pluginu Kaminaro class Array def paginable(page, per_page, total_elements_amount) @paginate_page = page @paginate_per_page = per_page @paginate_total_elements_amount = total_elements_amount self.instance_eval <<-EVAL def current_page @paginate_page.to_i end def num_pages (@paginate_total_elements_amount/@paginate_per_page).floor.to_i end def limit_value @paginate_per_page.to_i end EVAL end end
Od teraz możemy normalnie wykorzystywać tablicę@total_lines do paginacji:
<%= paginate @total_lines %>
March 27, 2011 — 00:26
Dzięki za koncept , użyłem go tutaj: https://github.com/outoftime/sunspot/pull/39