Sha256: d2a8a13bc9d3c0a18dec2739b76106f248464d7a3e7bd94035b6b8fc78d7dc61

Contents?: true

Size: 1.82 KB

Versions: 1

Compression:

Stored size: 1.82 KB

Contents

module DataMapper
  module Pagination
    
    ##
    # DataMapper::Pager instance.
    
    attr_accessor :pager
    
    ##
    # Page collection by the _page_ number and _options_ provided.
    #
    # Since pagers will commonly be used with query strings, we 
    # coerce all numeric strings such as '12' to their integer value 12.
    # This is the case for _page_, :per_page, :page, etc.
    #
    # === Options
    #
    #   :page       Current page number
    #   :per_page   Results per page; defaults to 6
    #   :order      Defaults to [:id.desc]
    #
    # === Examples
    #    
    #   User.all.page
    #   User.all.page(2)
    #   User.all.page(2, :per_page => 5)
    #   User.all.page(:page => 2, :per_page => 5)
    #
    
    def page page = nil, options = {}
      options, page = page, nil if page.is_a? Hash
      page ||= pager_option :page, options
      options.delete :page
      page = 1 unless (page = page.to_i) && page > 1
      per_page = pager_option(:per_page, options).to_i
      query = options.dup
      collection = new_collection scoped_query(options = {
        :limit => per_page,
        :offset => (page - 1) * per_page,
        :order => [:id.desc]
      }.merge(query))
      options.delete :order
      options.merge! :total => count(query), :page => page
      collection.pager = DataMapper::Pager.new options
      collection
    end
    
    private
    
    ##
    # Return value for _key_ from indifferent hash _options_.
    # 
    #  * Checks for sym key
    #  * Checks for string key
    #  * Checks DataMapper::Pagination.defaults for the sym key
    #  * Deletes both keys to prevent them from being part of the query
    #
    
    def pager_option key, options = {}
      a = options.delete key.to_sym
      b = options.delete key.to_s
      a || b || Pagination.defaults[key.to_sym]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dm-pager-1.0.0 lib/dm-pager/pagination.rb