class JobIteration::ActiveRecordEnumerator

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

Constants

SQL_DATETIME_WITH_NSEC

Public Class Methods

new(relation, columns: nil, batch_size: 100, cursor: nil) click to toggle source
# File lib/job-iteration/active_record_enumerator.rb, line 9
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

Public Instance Methods

batches() click to toggle source
# File lib/job-iteration/active_record_enumerator.rb, line 26
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
records() click to toggle source
# File lib/job-iteration/active_record_enumerator.rb, line 16
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
size() click to toggle source
# File lib/job-iteration/active_record_enumerator.rb, line 35
def size
  @relation.count
end

Private Instance Methods

column_value(record, attribute) click to toggle source
# File lib/job-iteration/active_record_enumerator.rb, line 54
def column_value(record, attribute)
  value = record.read_attribute(attribute.to_sym)
  case record.class.columns_hash.fetch(attribute).type
  when :datetime
    value.strftime(SQL_DATETIME_WITH_NSEC)
  else
    value
  end
end
cursor_value(record) click to toggle source
# File lib/job-iteration/active_record_enumerator.rb, line 41
def cursor_value(record)
  positions = @columns.map do |column|
    attribute_name = column.to_s.split(".").last
    column_value(record, attribute_name)
  end
  return positions.first if positions.size == 1
  positions
end
finder_cursor() click to toggle source
# File lib/job-iteration/active_record_enumerator.rb, line 50
def finder_cursor
  JobIteration::ActiveRecordCursor.new(@relation, @columns, @cursor)
end