123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::Batches::BatchEnumerator

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, ::Enumerable
Inherits: Object
Defined in: activerecord/lib/active_record/relation/batches/batch_enumerator.rb

Instance Attribute Summary

::Enumerable - Included

#many?

Returns true if the enumerable has more than 1 element.

Instance Method Summary

  • #each

    Yields an ::ActiveRecord::Relation object for each batch of records.

  • #each_record

    Looping through a collection of records from the database (using the all method, for example) is very inefficient since it will try to instantiate all the objects at once.

::Enumerable - Included

#exclude?

The negative of the Enumerable#include?.

#index_by

Convert an enumerable to a hash.

#pluck

Convert an enumerable to an array based on the given key.

#sum

Calculates a sum from the elements.

#without

Returns a copy of the enumerable without the specified elements.

Instance Method Details

#each

Yields an ::ActiveRecord::Relation object for each batch of records.

Person.in_batches.each do |relation|
  relation.update_all(awesome: true)
end
[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/batches/batch_enumerator.rb', line 62

def each
  enum = @relation.to_enum(:in_batches, of: @of, start: @start, finish: @finish, load: false)
  return enum.each { |relation| yield relation } if block_given?
  enum
end

#each_record

Looping through a collection of records from the database (using the all method, for example) is very inefficient since it will try to instantiate all the objects at once.

In that case, batch processing methods allow you to work with the records in batches, thereby greatly reducing memory consumption.

Person.in_batches.each_record do |person|
  person.do_awesome_stuff
end

Person.where("age > 21").in_batches(of: 10).each_record do |person|
  person.party_all_night!
end

If you do not provide a block to #each_record, it will return an Enumerator for chaining with other methods:

Person.in_batches.each_record.with_index do |person, index|
  person.award_trophy(index + 1)
end
[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/batches/batch_enumerator.rb', line 36

def each_record
  return to_enum(:each_record) unless block_given?

  @relation.to_enum(:in_batches, of: @of, start: @start, finish: @finish, load: true).each do |relation|
    relation.records.each { |record| yield record }
  end
end