Module: PagedScopes::Page

Extended by:
ActiveSupport::Memoizable
Defined in:
lib/paged_scopes/pages.rb

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#numberObject (readonly)

Returns the value of attribute number.



106
107
108
# File 'lib/paged_scopes/pages.rb', line 106

def number
  @number
end

#paginatorObject (readonly)

Returns the value of attribute paginator.



106
107
108
# File 'lib/paged_scopes/pages.rb', line 106

def paginator
  @paginator
end

Class Method Details

.included(base) ⇒ Object



13
14
15
# File 'lib/paged_scopes/pages.rb', line 13

def self.included(base)
  base.extend ClassMethods
end

Instance Method Details

#<=>(other) ⇒ Object



136
137
138
# File 'lib/paged_scopes/pages.rb', line 136

def <=>(other)
  number <=> other.number
end

#==(other) ⇒ Object



140
141
142
# File 'lib/paged_scopes/pages.rb', line 140

def ==(other)
  other.is_a?(self.class) && number == other.number
end

#first?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/paged_scopes/pages.rb', line 128

def first?
  number == 1
end

#full?Boolean

Returns:

  • (Boolean)


144
145
146
# File 'lib/paged_scopes/pages.rb', line 144

def full?
  !last? || page_scope.all.length == per_page # TODO: could improve this to calculate mathematically
end

#idObject



152
153
154
# File 'lib/paged_scopes/pages.rb', line 152

def id
  number
end

#initialize(number) ⇒ Object



110
111
112
113
114
115
116
# File 'lib/paged_scopes/pages.rb', line 110

def initialize(number)
  unless number > 0 && number <= page_count
    raise PageNotFound.new("couldn't find page number #{number}", self.class.closest_to(number))
  end
  @number = number
  @paginator = PagedScopes::Paginator.new(self)
end

#inspectObject



170
171
172
# File 'lib/paged_scopes/pages.rb', line 170

def inspect
  "#<#{self.class.name}, for: #{proxy.name}, number: #{number}>"
end

#last?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'lib/paged_scopes/pages.rb', line 132

def last?
  number == page_count
end

#nextObject



160
161
162
# File 'lib/paged_scopes/pages.rb', line 160

def next
  self.class.find(number + 1) unless last?
end

#offset(n) ⇒ Object



164
165
166
167
168
# File 'lib/paged_scopes/pages.rb', line 164

def offset(n)
  self.class.find(number + n)
rescue PageNotFound
  nil
end

#page_countObject



124
125
126
# File 'lib/paged_scopes/pages.rb', line 124

def page_count
  self.class.count
end

#page_scopeObject



174
175
176
177
178
179
180
181
182
183
184
# File 'lib/paged_scopes/pages.rb', line 174

def page_scope
  if proxy_scoped?(:limit)
    subquery_sql = proxy.name.constantize.send(:construct_finder_sql, proxy_options.merge(:select => "#{proxy.table_name}.#{proxy.primary_key}"))
    paged_conditions = "#{proxy.table_name}.#{proxy.primary_key} IN (#{subquery_sql})"
    paged_options = { :conditions => paged_conditions, :limit => per_page, :offset => (number - 1) * per_page }
    proxy.name.constantize.scoped(proxy_options.except(:limit, :offset)).scoped(paged_options)
    # can't exclude :conditions since it won't work for has_many :through associations (multiple identical records returned)
  else
    proxy.scoped(:limit => per_page, :offset => (number - 1) * per_page)      
  end
end

#previousObject



156
157
158
# File 'lib/paged_scopes/pages.rb', line 156

def previous
  self.class.find(number - 1) unless first?
end

#reload!Object



118
119
120
121
122
# File 'lib/paged_scopes/pages.rb', line 118

def reload!
  self.class.reload!
  self.class.find(number)
  unmemoize_all
end

#to_paramObject



148
149
150
# File 'lib/paged_scopes/pages.rb', line 148

def to_param
  number.to_s
end