Module: ActiveRecord::Collections::Batching

Included in:
ActiveRecord::Collection
Defined in:
lib/active_record/collections/batching.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



4
5
6
# File 'lib/active_record/collections/batching.rb', line 4

def self.included(base)
  base.send :extend, ClassMethods
end

Instance Method Details

#as_batchObject



68
69
70
# File 'lib/active_record/collections/batching.rb', line 68

def as_batch
  dup.is_batch!
end

#as_batches {|batches.first| ... } ⇒ Object Also known as: in_batches

Yields:

  • (batches.first)


86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/active_record/collections/batching.rb', line 86

def as_batches(&block)
  total_count # init count once before duping
  batched = dup.batch!
  batches = [batched.first_batch!.as_batch]
  yield batches.first if block_given?
  while batched.next_batch? do
    b = batched.next_batch!.as_batch
    yield b if block_given?
    batches << b
  end
  batches
end

#as_next_batchObject



72
73
74
# File 'lib/active_record/collections/batching.rb', line 72

def as_next_batch
  next_page!.as_batch
end

#batch_by_default?Boolean

Returns:

  • (Boolean)


46
47
48
49
50
# File 'lib/active_record/collections/batching.rb', line 46

def batch_by_default?
  self.class.batch_by_default? ||
  ( batching_threshold > 0 &&
    total_records >= batching_threshold )
end

#batching_thresholdObject



42
43
44
# File 'lib/active_record/collections/batching.rb', line 42

def batching_threshold
  self.class.batching_threshold
end

#current_pageObject Also known as: current_batch



140
141
142
# File 'lib/active_record/collections/batching.rb', line 140

def current_page
  @page || 1
end

#default_batch_sizeObject



38
39
40
# File 'lib/active_record/collections/batching.rb', line 38

def default_batch_size
  self.class.default_batch_size
end

#each_page(&block) ⇒ Object Also known as: each_batch



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/active_record/collections/batching.rb', line 156

def each_page(&block)
  batch! if should_batch?

  if total_pages <= 1
    yield to_a if block_given?
    return [to_a]
  end

  first_page!
  paged = []
  total_pages.times do
    paged << to_a
    yield to_a if block_given?
    next_page!
  end
  first_page!
  paged
end

#first_pageObject Also known as: first_batch



199
200
201
# File 'lib/active_record/collections/batching.rb', line 199

def first_page
  dup.first_page!
end

#first_page!Object Also known as: first_batch!



204
205
206
# File 'lib/active_record/collections/batching.rb', line 204

def first_page!
  page!(1)
end

#flat_page_map(&block) ⇒ Object Also known as: flat_batch_map



194
195
196
# File 'lib/active_record/collections/batching.rb', line 194

def flat_page_map(&block)
  page_map(&block).flatten
end

#is_batch!Object



58
59
60
61
# File 'lib/active_record/collections/batching.rb', line 58

def is_batch!
  @is_batch = true
  self
end

#is_batch?Boolean Also known as: batch?

Returns:

  • (Boolean)


63
64
65
# File 'lib/active_record/collections/batching.rb', line 63

def is_batch?
  @is_batch || false
end

#last_pageObject Also known as: last_batch



239
240
241
# File 'lib/active_record/collections/batching.rb', line 239

def last_page
  dup.last_page!
end

#last_page!Object Also known as: last_batch!



244
245
246
# File 'lib/active_record/collections/batching.rb', line 244

def last_page!
  page!(total_pages)
end

#next_pageObject Also known as: next_batch



214
215
216
# File 'lib/active_record/collections/batching.rb', line 214

def next_page
  dup.next_page!
end

#next_page!Object Also known as: next_batch!



219
220
221
# File 'lib/active_record/collections/batching.rb', line 219

def next_page!
  page!(current_page + 1) if next_page?
end

#next_page?Boolean Also known as: next_batch?

Returns:

  • (Boolean)


209
210
211
# File 'lib/active_record/collections/batching.rb', line 209

def next_page?
  current_page < total_pages
end

#page(*num) ⇒ Object Also known as: batch

TODO Mark need to either depend on kaminari or check for it before using page/per



101
102
103
# File 'lib/active_record/collections/batching.rb', line 101

def page(*num)
  dup.page!(*num)
end

#page!(*num) ⇒ Object Also known as: batch!



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

def page!(*num)
  reset!(false, false)
  @page = num[0] || 1
  @per ||= default_batch_size
  @relation = relation.page(@page).per(@per)
  self
end

#page_map(&block) ⇒ Object Also known as: batch_map



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/active_record/collections/batching.rb', line 176

def page_map(&block)
  batch! if should_batch?

  if total_pages <= 1
    return (block_given? ? yield(to_a) : to_a)
  end

  first_page!
  paged = []
  total_pages.times do
    paged << (block_given? ? yield(to_a) : to_a)
    next_page!
  end
  first_page!
  paged
end

#paginated?(check_if_should = false) ⇒ Boolean Also known as: batched?

Returns:

  • (Boolean)


129
130
131
132
133
134
135
136
137
# File 'lib/active_record/collections/batching.rb', line 129

def paginated?(check_if_should=false)
  return true if !(@page.nil? && @per.nil?)
  if check_if_should && should_batch?(false)
    batch!
    true
  else
    false
  end
end

#per(num = nil) ⇒ Object Also known as: batch_size



115
116
117
# File 'lib/active_record/collections/batching.rb', line 115

def per(num=nil)
  dup.per!(num)
end

#per!(num) ⇒ Object Also known as: batch_size!



120
121
122
123
124
125
126
# File 'lib/active_record/collections/batching.rb', line 120

def per!(num)
  reset!(false, false)
  @page ||= 1
  @per = num
  @relation = relation.page(@page).per(@per)
  self
end

#per_pageObject Also known as: per_batch



145
146
147
# File 'lib/active_record/collections/batching.rb', line 145

def per_page
  @per || total_count
end

#prev_pageObject Also known as: prev_batch



229
230
231
# File 'lib/active_record/collections/batching.rb', line 229

def prev_page
  dup.prev_page!
end

#prev_page!Object Also known as: prev_batch!



234
235
236
# File 'lib/active_record/collections/batching.rb', line 234

def prev_page!
  page!(current_page - 1) if prev_page?
end

#prev_page?Boolean Also known as: prev_batch?

Returns:

  • (Boolean)


224
225
226
# File 'lib/active_record/collections/batching.rb', line 224

def prev_page?
  current_page > 1
end

#should_batch?(check_if_batched = true) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
55
56
# File 'lib/active_record/collections/batching.rb', line 52

def should_batch?(check_if_batched=true)
  return false if is_batch?
  return false if check_if_batched && batched?
  batch_by_default?
end

#to_batchesObject



76
77
78
79
80
81
82
83
84
# File 'lib/active_record/collections/batching.rb', line 76

def to_batches
  total_count # init count once before duping
  batched = dup.batch!
  batches = [batched.first_batch!.as_batch]
  while batched.next_batch? do
    batches << batched.next_batch!.as_batch
  end
  batches
end

#total_pagesObject Also known as: total_batches



150
151
152
153
# File 'lib/active_record/collections/batching.rb', line 150

def total_pages
  return 1 if is_batch?
  (total_count.to_f / per_page.to_f).ceil
end