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

Instance Method Details

#cloneObject



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

def clone
  copy_will_paginate_data super
end

#count(*args) ⇒ Object



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

def count(*args)
  if limit_value
    excluded = [:order, :limit, :offset, :reorder]
    excluded << :includes unless eager_loading?
    rel = self.except(*excluded)
    column_name = if rel.select_values.present?
      select = rel.select_values.join(", ")
      select if select !~ /[,*]/
    end || :all
    rel.count(column_name)
  else
    super(*args)
  end
end

#empty?Boolean

overloaded to be pagination-aware

Returns:

  • (Boolean)


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

def empty?
  if !loaded? and offset_value
    total_entries <= offset_value
  else
    super
  end
end

#find_last(*args) ⇒ Object

fix for Rails 3.0



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

def find_last(*args)
  if !loaded? && args.empty? && (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



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

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