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