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



68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/will_paginate/active_record.rb', line 68

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



114
115
116
# File 'lib/will_paginate/active_record.rb', line 114

def clone
  copy_will_paginate_data super
end

#countObject



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

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)


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

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

#find_lastObject

fix for Rails 3.0



54
55
56
57
58
59
60
# File 'lib/will_paginate/active_record.rb', line 54

def find_last
  if !loaded? and offset_value || limit_value
    @last ||= to_a.last
  else
    super
  end
end

#first(*args) ⇒ Object

dirty hack to enable ‘first` after `limit` behavior above



43
44
45
46
47
48
49
50
51
# File 'lib/will_paginate/active_record.rb', line 43

def first(*args)
  if current_page
    rel = clone
    rel.current_page = nil
    rel.first(*args)
  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



62
63
64
65
66
# File 'lib/will_paginate/active_record.rb', line 62

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



119
120
121
# File 'lib/will_paginate/active_record.rb', line 119

def scoped(options = nil)
  copy_will_paginate_data super
end

#sizeObject

workaround for Active Record 3.0



95
96
97
98
99
100
101
# File 'lib/will_paginate/active_record.rb', line 95

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

#to_aObject



123
124
125
126
127
128
129
130
131
# File 'lib/will_paginate/active_record.rb', line 123

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