Skip to content

Instantly share code, notes, and snippets.

@TertiumQuid
Created May 12, 2011 14:09
Show Gist options
  • Save TertiumQuid/968566 to your computer and use it in GitHub Desktop.
Save TertiumQuid/968566 to your computer and use it in GitHub Desktop.
Quick and Dirty Rails Pagination Extension With Scope
module ActiveSupport
module PagedScope
def self.extended(base)
base.scope :paginated, lambda { |page,per_page|
page ||= 0
per_page ||= 25
base.limit( per_page.to_i ).offset( per_page.to_i * page.to_i )
}
end
end
end
class User < ActiveRecord::Base
extend ActiveSupport::PagedScope
end
>> User.paginated(1,25).count
=> 25
@Drowze
Copy link

Drowze commented Oct 24, 2016

Thanks for the gist!
I'm a Rails beginner and was using will_paginate gem just for .paginate method alone, but for my case it did make more sense to implement some custom scope instead of a whole gem. So, based on your gist I did:

class SomeModel < ActiveRecord::Base
  scope :paginatee, -> (pagination) {
    limit( pagination[:per_page].to_i ).offset( pagination[:per_page].to_i * (pagination[:page].to_i - 1))
  }
end

Example use:

SomeModel.pagination(page: 1, per_page: 10).to_sql
#=> "SELECT  \"some_models\".* FROM \"some_models\" LIMIT 10 OFFSET 0")
SomeModel.pagination(page: 4, per_page: 5).to_sql
#=> "SELECT  \"some_models\".* FROM \"some_models\" LIMIT 5 OFFSET 15")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment