module Leaf::Finders::Base
Database-agnostic finder module¶ ↑
Out of the box, leaf supports hooking in the Sequel ORM
Public Instance Methods
This is the main paginating finder.
Special parameters for paginating finders¶ ↑
-
:page
– REQUIRED, but defaults to 1 if false or nil -
:per_page
– defaults toCurrentModel.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 tocount
-
: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
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
# File lib/leaf/finders/base.rb, line 9 def per_page @per_page ||= 30 end
# File lib/leaf/finders/base.rb, line 13 def per_page=(limit) @per_page = limit.to_i end
Protected Instance Methods
# 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