module Leaf::Finders::Base

Database-agnostic finder module

Out of the box, leaf supports hooking in the Sequel ORM

Public Instance Methods

paginate(*args, &block) click to toggle source

This is the main paginating finder.

Special parameters for paginating finders

  • :page – REQUIRED, but defaults to 1 if false or nil

  • :per_page – defaults to CurrentModel.per_page (which is 30 if not overridden)

  • :total_entries – use only if you manually count total entries

  • :count – additional options that are passed on to count

  • :finder – name of the finder method to use (default: “find”)

All other options (conditions, order, …) are forwarded to find and count calls.

# File lib/leaf/finders/base.rb, line 28
def paginate(*args, &block)
  options = args.pop
  page, per_page, total_entries = leaf_parse_options(options)

  Leaf::Collection.create(page, per_page, total_entries) do |pager|
    query_options = options.except :page, :per_page, :total_entries
    wp_query(query_options, pager, args, &block)
  end
end
paginated_each(options = {}, &block) click to toggle source

Iterates through all records by loading one page at a time. This is useful for migrations or any other use case where you don't want to load all the records in memory at once.

It uses paginate internally; therefore it accepts all of its options. You can specify a starting page with :page (default is 1). Default :order is "id", override if necessary.

Jamis Buck describes this and also uses a more efficient way for MySQL.

# File lib/leaf/finders/base.rb, line 48
def paginated_each(options = {}, &block)
  options = { :order => 'id', :page => 1 }.merge options
  options[:page] = options[:page].to_i
  options[:total_entries] = 0 # skip the individual count queries
  total = 0
  
  begin 
    collection = paginate(options)
    total += collection.each(&block).size
    options[:page] += 1
  end until collection.size < collection.per_page
  
  total
end
per_page() click to toggle source
# File lib/leaf/finders/base.rb, line 9
def per_page
  @per_page ||= 30
end
per_page=(limit) click to toggle source
# File lib/leaf/finders/base.rb, line 13
def per_page=(limit)
  @per_page = limit.to_i
end

Protected Instance Methods

leaf_parse_options(options) click to toggle source
# File lib/leaf/finders/base.rb, line 65
def leaf_parse_options(options)
  raise ArgumentError, 'parameter hash expected' unless Hash === options
  raise ArgumentError, ':page parameter required' unless options.key? :page
  
  if options[:count] and options[:total_entries]
    raise ArgumentError, ':count and :total_entries are mutually exclusive'
  end

  page     = options[:page] || 1
  per_page = options[:per_page] || self.per_page
  total    = options[:total_entries]
  
  return [page, per_page, total]
end