Pagy

· Padrão API
Juan Kalleo
Juan Kalleo
Backend/API
This page hasn't been translated to English yet — showing the original Portuguese content.

O que é

Biblioteca de paginação pra Rails — leve (sem dependência de outra gem, diferente de Kaminari/will_paginate), calcula página atual, total de páginas e total de registros a partir de uma query ActiveRecord comum.

Por que essa

Escolhida pela leveza e por já ser a paginação usada em outros projetos irmãos do mesmo template de backend — reaproveitar a mesma lib entre projetos evita reaprender uma API de paginação diferente a cada vez. Ver Paginação pro funcionamento completo (teto de itens, formato do metadado, uso real num controller).

Versão

pagy (5.10.1), travada explicitamente:

# Gemfile
gem "pagy", "~> 5.10" # travado na major usada em locacao/api — Pagy 6+/40+ mudou a API (Pagy::Backend não existe mais do mesmo jeito)

Trocar de major sem revisar a migração da gem quebraria o include Pagy::Backend (ver abaixo) silenciosamente.

Como importar

# Gemfile
gem "pagy", "~> 5.10"
# app/controllers/concerns/pagy_pagination.rb
include Pagy::Backend

Exemplo real

MAX_PER_PAGE = 100

def paginate(query, per_page, serializer: nil, serializer_options: {})
  items = per_page.blank? ? 25 : per_page.to_i.clamp(1, MAX_PER_PAGE)
  pagy, records = pagy(query, items: items)
  {
    pagy: { current_page: pagy.page, total_pages: pagy.pages, total_count: pagy.count, per_page: pagy.items },
    items: serializer ? ActiveModelSerializers::SerializableResource.new(records, each_serializer: serializer, include: "**", **serializer_options) : records
  }
end

Onde usar no projeto

app/controllers/concerns/pagy_pagination.rb, incluído em ApplicationController — todo index de recurso admin passa por render_paginated_result, que chama esse paginate por baixo.