Spec-Zone.ru › Ruby on Rails 5.1

class ActiveRecord::Batches::BatchEnumerator

Parent:
Object
Included modules:
Enumerable

Публичные методы экземпляров

each() { |relation| ... } Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 60
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

Выводит объект ActiveRecord::Relation для каждой группы записей.

Person.in_batches.each do |relation|
  relation.update_all(awesome: true)
end
each_record() { |record| ... } Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 34
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

Проход по коллекции записей из базы данных (например, с помощью метода all) очень неэффективен, так как он пытается создать все объекты сразу.

В этом случае методы пакетной обработки позволяют работать с записями по частям, существенно уменьшая потребление памяти.

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

Если вы не предоставите блок методу each_record, он вернёт перечислитель для цепочки с другими методами:

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

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API