Module: WillPaginate::ActiveRecord::RelationMethods

Includes:
CollectionMethods
Defined in:
lib/will_paginate/active_record.rb

Overview

makes a Relation look like WillPaginate::Collection

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from CollectionMethods

#next_page, #out_of_bounds?, #previous_page, #total_pages

Instance Attribute Details

#current_pageObject

Returns the value of attribute current_page.



23
24
25
# File 'lib/will_paginate/active_record.rb', line 23

def current_page
  @current_page
end

#total_entriesObject



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/will_paginate/active_record.rb', line 48

def total_entries
  @total_entries ||= begin
    if loaded? and size < limit_value and (current_page == 1 or size > 0)
      offset_value + size
    else
      @total_entries_queried = true
      result = count
      result = result.size if result.respond_to?(:size) and !result.is_a?(Integer)
      result
    end
  end
end

#wp_count_options=(value) ⇒ Object (writeonly)

Sets the attribute wp_count_options

Parameters:

  • value

    the value to set the attribute wp_count_options to.



24
25
26
# File 'lib/will_paginate/active_record.rb', line 24

def wp_count_options=(value)
  @wp_count_options = value
end

Instance Method Details

#cloneObject



94
95
96
# File 'lib/will_paginate/active_record.rb', line 94

def clone
  copy_will_paginate_data super
end

#countObject



61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/will_paginate/active_record.rb', line 61

def count
  if limit_value
    excluded = [:order, :limit, :offset]
    excluded << :includes unless eager_loading?
    rel = self.except(*excluded)
    # TODO: hack. decide whether to keep
    #rel = rel.apply_finder_options(@wp_count_options) if defined? @wp_count_options
    rel.count
  else
    super
  end
end

#empty?Boolean

overloaded to be pagination-aware

Returns:

  • (Boolean)


84
85
86
87
88
89
90
91
92
# File 'lib/will_paginate/active_record.rb', line 84

def empty?
  if !loaded? and offset_value
    result = count
    result = result.size if result.respond_to?(:size) and !result.is_a?(Integer)
    result <= offset_value
  else
    super
  end
end

#limit(num) ⇒ Object

TODO: solve with less relation clones and code dups



33
34
35
36
37
38
39
40
# File 'lib/will_paginate/active_record.rb', line 33

def limit(num)
  rel = super
  if rel.current_page
    rel.offset rel.current_page.to_offset(rel.limit_value).to_i
  else
    rel
  end
end

#offset(value = nil) ⇒ Object



42
43
44
45
46
# File 'lib/will_paginate/active_record.rb', line 42

def offset(value = nil)
  if value.nil? then offset_value
  else super(value)
  end
end

#per_page(value = nil) ⇒ Object



26
27
28
29
30
# File 'lib/will_paginate/active_record.rb', line 26

def per_page(value = nil)
  if value.nil? then limit_value
  else limit(value)
  end
end

#scoped(options = nil) ⇒ Object

workaround for Active Record 3.0



99
100
101
# File 'lib/will_paginate/active_record.rb', line 99

def scoped(options = nil)
  copy_will_paginate_data super
end

#sizeObject

workaround for Active Record 3.0



75
76
77
78
79
80
81
# File 'lib/will_paginate/active_record.rb', line 75

def size
  if !loaded? and limit_value and group_values.empty?
    [super, limit_value].min
  else
    super
  end
end

#to_aObject



103
104
105
106
107
108
109
110
111
# File 'lib/will_paginate/active_record.rb', line 103

def to_a
  if current_page.nil? then super # workaround for Active Record 3.0
  else
    ::WillPaginate::Collection.create(current_page, limit_value) do |col|
      col.replace super
      col.total_entries ||= total_entries
    end
  end
end