class Sidekiq::Job::Iterable::ActiveRecordEnumerator

@api private

Public Class Methods

new(relation, cursor: nil, **options) click to toggle source
# File lib/sidekiq/job/iterable/active_record_enumerator.rb, line 8
def initialize(relation, cursor: nil, **options)
  @relation = relation
  @cursor = cursor
  @options = options
end

Public Instance Methods

batches() click to toggle source
# File lib/sidekiq/job/iterable/active_record_enumerator.rb, line 22
def batches
  Enumerator.new(-> { @relation.count }) do |yielder|
    @relation.find_in_batches(**@options, start: @cursor) do |batch|
      yielder.yield(batch, batch.first.id)
    end
  end
end
records() click to toggle source
# File lib/sidekiq/job/iterable/active_record_enumerator.rb, line 14
def records
  Enumerator.new(-> { @relation.count }) do |yielder|
    @relation.find_each(**@options, start: @cursor) do |record|
      yielder.yield(record, record.id)
    end
  end
end
relations() click to toggle source
# File lib/sidekiq/job/iterable/active_record_enumerator.rb, line 30
def relations
  Enumerator.new(-> { relations_size }) do |yielder|
    # Convenience to use :batch_size for all the
    # ActiveRecord batching methods.
    options = @options.dup
    options[:of] ||= options.delete(:batch_size)

    @relation.in_batches(**options, start: @cursor) do |relation|
      first_record = relation.first
      yielder.yield(relation, first_record.id)
    end
  end
end

Private Instance Methods

relations_size() click to toggle source
# File lib/sidekiq/job/iterable/active_record_enumerator.rb, line 46
def relations_size
  batch_size = @options[:batch_size] || 1000
  (@relation.count + batch_size - 1) / batch_size # ceiling division
end