Class: JobIteration::ActiveRecordEnumerator

Inherits:
Object
  • Object
show all
Defined in:
lib/job-iteration/active_record_enumerator.rb

Overview

Builds Enumerator based on ActiveRecord Relation. Supports enumerating on rows and batches.

See Also:

Instance Method Summary collapse

Constructor Details

#initialize(relation, columns: nil, batch_size: 100, cursor: nil) ⇒ ActiveRecordEnumerator

Returns a new instance of ActiveRecordEnumerator.



7
8
9
10
11
12
# File 'lib/job-iteration/active_record_enumerator.rb', line 7

def initialize(relation, columns: nil, batch_size: 100, cursor: nil)
  @relation = relation
  @batch_size = batch_size
  @columns = Array(columns || "#{relation.table_name}.#{relation.primary_key}")
  @cursor = cursor
end

Instance Method Details

#batchesObject



24
25
26
27
28
29
30
31
# File 'lib/job-iteration/active_record_enumerator.rb', line 24

def batches
  cursor = finder_cursor
  Enumerator.new(method(:size)) do |yielder|
    while records = cursor.next_batch(@batch_size)
      yielder.yield(records, cursor_value(records.last)) if records.any?
    end
  end
end

#recordsObject



14
15
16
17
18
19
20
21
22
# File 'lib/job-iteration/active_record_enumerator.rb', line 14

def records
  Enumerator.new(method(:size)) do |yielder|
    batches.each do |batch, _|
      batch.each do |record|
        yielder.yield(record, cursor_value(record))
      end
    end
  end
end

#sizeObject



33
34
35
# File 'lib/job-iteration/active_record_enumerator.rb', line 33

def size
  @relation.count
end