Phân trang trong Rails sử dụng gem pagy

Pagy là một thư viện phân trang tương đối nhanh nếu so sánh với các thư viện quen thuộc như Kaminari và will_paginate. Bạn có thể xem so sánh về việc sử dụng bộ nhớ và tốc độ xử lý giữa 3 thư viện này theo ảnh dưới.

Cài đặt

Thêm dòng dưới vào Gemfile xong chạy bundle install

gem "pagy"

include trong ApplicationController

Include Pagy::Backend

Include trong ApplicationHelper

include Pagy::Frontend

Cách sử dụng

Ở trong controller chỉ cần gọi

@pagy, @users = pagy(User.all)

@pagy sẽ có giá trị nhau ví dụ dưới:

 @page=1,
 @pages=5,
 @prev=nil,
 @to=2,
 @vars=
  {:page=>1,
   :items=>2,   
   :outset=>0,
   :size=>[1, 4, 4, 1],
   :page_param=>:page,
   :params=>{},
   :anchor=>"",
   :link_extra=>"",
   :item_path=>"pagy.info.item_name",
   :count=>10}>

Để thay đổi các giá trị mặc định của pagy sẽ có 2 cách. Bạn có thể chọn một trong 2 cái tùy theo trường hợp mà bạn cần sử dụng:

  1. Trong initializers tạo file pagy.rb. Giá trị thay đổi sẽ được áp dụng cho tất cả các chỗ sử dụng pagy. Vd: trong pagy.rb thêm vào dòng dưới để thay đổi giá trị mặc định items trong một trang
Pagy::VARS[:items] = 25
  1. Chỉ cần thay đổi một chỗ mà bạn cần sử dụng Vd:
@pagy, @users = pagy(User.all, items: 30)

Sử dụng pagy template

Pagy có hỗ trợ các template như pagy_nav, pagy_nav_bootstrap, pagy_nav_bulmapagy_nav_foundation . Nếu bạn cần chỉnh sửa lại template bạn có thể làm theo các này. nhưng việc chỉnh sửa lại template có thể ảnh hưởng đến tốc độ render. Mình sẽ cho một ví dụ về việc sử dụng template pagy_nav_bootstrap. Trong file initializers/pagy.rb thêm include pagy bootstrap vào

require 'pagy/extras/bootstrap'

Sau đó bạn có thể chọn một trong 3 cái dưới để show phân trạng

<%== pagy_nav_bootstrap(@pagy) %>
<%== pagy_nav_responsive_bootstrap(@pagy) %>
<%== pagy_nav_compact_bootstrap(@pagy) %>

Chú ý: để sử dụng được các template bạn phải có sử dụng các thư viện đó trong project. Như trên thì bạn phải có thư viện bootstrap mới hiển thị được pagy_nav_bootstrap. Các bạn có thể tìm hiểu thêm về pagy theo link dưới đây: