Paginacja (pagination) z pomocą Kaminari a paginacja tablic (Array)

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:

  1. page - na której stronie jesteśmy (którą stronę wyświetlamy),
  2. per_page - ile elementów na stronie,
  3. 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 %>

Categories: Rails, Ruby

1 Comment

  1. Dzięki za koncept , użyłem go tutaj: https://github.com/outoftime/sunspot/pull/39

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑