# frozen_string_literal: true # DESCRIPTION # Showcase the keyset ActiveRecord pagination # # DOC # https://ddnexus.github.io/pagy/playground/#5-keyset-apps # # BIN HELP # bundle exec pagy -h # # DEV USAGE # bundle exec pagy clone keyset_ar # bundle exec pagy ./keyset_ar.ru # # URL # http://0.0.0.0:8000 VERSION = '9.3.0' # Bundle require 'bundler/inline' require 'bundler' Bundler.configure gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do source 'https://rubygems.org' gem 'puma' gem 'sequel' gem 'sinatra' gem 'sqlite3' end # Pagy initializer require 'pagy/extras/limit' require 'pagy/extras/keyset' require 'pagy/extras/pagy' Pagy::DEFAULT[:limit] = 10 Pagy::DEFAULT.freeze # Sinatra setup require 'sinatra/base' require 'logger' # Sinatra application class PagyKeyset < Sinatra::Base include Pagy::Backend # Root route/action get '/' do @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc } @pagy, @pets = pagy_keyset(Pet.order(:animal, :name, Sequel.desc(:birthdate), :id)) erb :main end helpers do include Pagy::Frontend def order_symbol(dir) { asc: '↗', desc: '↘' }[dir] end end # Views template :layout do <<~ERB Pagy Keyset App <%= yield %> ERB end template :main do <<~ERB

Pagy Keyset App

Self-contained, standalone app usable to easily reproduce any keyset related pagy issue with ActiveRecord sets.

Please, report the following versions in any new issue.

Versions

Collection

<% @pets.each do |pet| %> <% end %>
animal <%= order_symbol(@order[:animal]) %> name <%= order_symbol(@order[:name]) %> birthdate <%= order_symbol(@order[:birthdate]) %> id <%= order_symbol(@order[:id]) %>
<%= pet.animal %> <%= pet.name %> <%= pet.birthdate %> <%= pet.id %>

ERB end end # Sequel setup require 'sequel' Sequel.default_timezone = :utc # SQLite DB files dir = ENV['APP_ENV'].equal?('development') ? '.' : Dir.pwd # app dir in dev or pwd otherwise abort "ERROR: Cannot create DB files: the directory #{dir.inspect} is not writable." \ unless File.writable?(dir) # Connection output = ENV['APP_ENV'].equal?('showcase') ? IO::NULL : $stdout DB = Sequel.connect(adapter: 'sqlite', user: 'root', password: 'password', host: 'localhost', port: '3306', database: "#{dir}/tmp/pagy-keyset-s.sqlite3", max_connections: 10, loggers: [Logger.new(output)]) # Schema DB.create_table! :pets do primary_key :id String :animal, unique: false, null: false String :name, unique: false, null: false Date :birthdate, unique: false, null: false end # Models class Pet < Sequel::Model; end data = <<~DATA Luna | dog | 2018-03-10 Coco | cat | 2019-05-15 Dodo | dog | 2020-06-25 Wiki | bird | 2018-03-12 Baby | rabbit | 2020-01-13 Neki | horse | 2021-07-20 Tino | donkey | 2019-06-18 Plot | cat | 2022-09-21 Riki | cat | 2018-09-14 Susi | horse | 2018-10-26 Coco | pig | 2020-08-29 Momo | bird | 2023-08-25 Lili | cat | 2021-07-22 Beli | pig | 2020-07-26 Rocky | bird | 2022-08-19 Vyvy | dog | 2018-05-16 Susi | horse | 2024-01-25 Ella | cat | 2020-02-20 Rocky | dog | 2019-09-19 Juni | rabbit | 2020-08-24 Coco | bird | 2021-03-17 Susi | dog | 2021-07-28 Luna | horse | 2023-05-14 Gigi | pig | 2022-05-19 Coco | cat | 2020-02-20 Nino | donkey | 2019-06-17 Luna | cat | 2022-02-09 Popi | dog | 2020-09-26 Lili | pig | 2022-06-18 Mina | horse | 2021-04-21 Susi | rabbit | 2023-05-18 Toni | donkey | 2018-06-22 Rocky | horse | 2019-09-28 Lili | cat | 2019-03-18 Roby | cat | 2022-06-19 Anto | horse | 2022-08-18 Susi | pig | 2021-04-21 Boly | bird | 2020-03-29 Sky | cat | 2023-07-19 Lili | dog | 2020-01-28 Fami | snake | 2023-04-27 Lopi | pig | 2019-06-19 Rocky | snake | 2022-03-13 Denis | dog | 2022-06-19 Maca | cat | 2022-06-19 Luna | dog | 2022-08-15 Jeme | horse | 2019-08-08 Sary | bird | 2023-04-29 Rocky | bird | 2023-05-14 Coco | dog | 2023-05-27 DATA dataset = DB[:pets] data.each_line(chomp: true) do |pet| name, animal, birthdate = pet.split('|').map(&:strip) dataset.insert(name:, animal:, birthdate:) end run PagyKeyset