Using will_paginate with Sequel and Mongoid

will_paginate provides integrations for popular alternatives to ActiveRecord, including the Sequel ORM and the Mongoid ODM for MongoDB.

Sequel

The Sequel ORM has its own robust pagination support through the sequel/extensions/pagination extension. The will_paginate gem provides a compatibility layer that makes Sequel's paginated datasets work seamlessly with the will_paginate view helpers.

Setup

First, ensure you have Sequel's pagination extension enabled and then require the will_paginate integration file.

require 'sequel'
require 'sequel/extensions/pagination'
require 'will_paginate/sequel'

# Connect to your database
DB = Sequel.sqlite # for example

# Enable pagination on your dataset
class Car < Sequel::Model
  self.dataset = dataset.extension(:pagination)
end

Usage

You can now use Sequel's native paginate method. The resulting dataset will have methods like total_pages, per_page, total_entries, and current_page, making it compatible with will_paginate view helpers.

# Get the first page with 2 cars per page
@cars = Car.dataset.paginate(1, 2)

@cars.current_page  # => 1
@cars.page_size     # => 2 (aliased to per_page)
@cars.page_count    # => 2 (aliased to total_pages)

# This works with filters and orders as well
@cars = Car.order(:name).filter(name: 'Shelby').paginate(1, 10)

Mongoid

For Mongoid, will_paginate adds the paginate and page methods directly to Mongoid::Criteria, providing an API very similar to the ActiveRecord integration.

Setup

In your application, require the Mongoid integration file:

require 'mongoid'
require 'will_paginate/mongoid'

# ... your Mongoid setup

Usage

Once required, you can call .paginate or .page on any Mongoid criteria object.

# Using the paginate method
@posts = Post.paginate(page: params[:page], per_page: 10)

# Using the chainable page method
@posts = Post.where(published: true).page(params[:page])

# Check pagination attributes
@posts.current_page  # => 1
@posts.total_entries # => (total count of matching documents)
@posts.total_pages   # => (calculated total pages)

Both integrations ensure that you can use the standard will_paginate view helpers in your templates regardless of the underlying data store.