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 |
Constant Summary
::Enumerable
- Included
INDEX_WITH_DEFAULT
Instance Attribute Summary
::Enumerable
- Included
#many? | Returns |
Instance Method Summary
-
#delete_all
Deletes records in batches.
-
#destroy_all
Destroys records in batches.
-
#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. -
#update_all(updates)
Updates records in batches.
::Enumerable
- Included
#compact_blank | Returns a new |
#exclude? | The negative of the |
#excluding | Returns a copy of the enumerable excluding the specified elements. |
#including | Returns a new array that includes the passed elements. |
#index_by | Convert an enumerable to a hash, using the block result as the key and the element as the value. |
#index_with | Convert an enumerable to a hash, using the element as the key and the block result as the value. |
#pick | Extract the given key from the first element in the enumerable. |
#pluck | Extract the given key from each element in the enumerable. |
#sum | Calculates a sum from the elements. |
#without | Alias for |
Instance Method Details
#delete_all
Deletes records in batches. Returns the total number of rows affected.
Person.in_batches.delete_all
See Relation#delete_all for details of how each batch is deleted.
# File 'activerecord/lib/active_record/relation/batches/batch_enumerator.rb', line 49
def delete_all sum(&:delete_all) end
#destroy_all
Destroys records in batches.
Person.where("age < 10").in_batches.destroy_all
See Relation#destroy_all for details of how each batch is destroyed.
# File 'activerecord/lib/active_record/relation/batches/batch_enumerator.rb', line 69
def destroy_all each(&:destroy_all) end
#each
Yields an ::ActiveRecord::Relation
object for each batch of records.
Person.in_batches.each do |relation|
relation.update_all(awesome: true)
end
# File 'activerecord/lib/active_record/relation/batches/batch_enumerator.rb', line 78
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
# 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
#update_all(updates)
Updates records in batches. Returns the total number of rows affected.
Person.in_batches.update_all("age = age + 1")
See Relation#update_all for details of how each batch is updated.
# File 'activerecord/lib/active_record/relation/batches/batch_enumerator.rb', line 58
def update_all(updates) sum do |relation| relation.update_all(updates) end end