Spec-Zone.ru › Ruby on Rails 8.1

класс ActiveRecord::Batches::BatchEnumerator

Родительский класс:
Object
Подключённые модули:
Enumerable

Атрибуты

finish [R]

Значение первичного ключа, на котором заканчивается BatchEnumerator, включая это значение.

relation [R]

Связь, из которой BatchEnumerator возвращает пакеты.

start [R]

Значение первичного ключа, с которого начинается BatchEnumerator, включая это значение.

Открытые методы экземпляра

batch_size () Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 28
def batch_size
  @of
end

Размер пакетов, возвращаемых BatchEnumerator.

delete_all () Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 66
def delete_all
  sum(&:delete_all)
end

Удаляет записи пакетами. Возвращает общее количество затронутых строк.

Person.in_batches.delete_all

Подробные сведения об удалении каждого пакета см. в описании Relation#delete_all.

destroy_all () Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 97
def destroy_all
  sum do |relation|
    relation.destroy_all.count(&:destroyed?)
  end
end

Уничтожает записи пакетами. Возвращает общее количество затронутых строк.

Person.where("age < 10").in_batches.destroy_all

Подробные сведения об уничтожении каждого пакета см. в описании Relation#destroy_all.

each (&block) Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 108
def each(&block)
  enum = @relation.to_enum(:in_batches, of: @of, start: @start, finish: @finish, load: false, cursor: @cursor, order: @order, use_ranges: @use_ranges)
  return enum.each(&block) if block_given?
  enum
end

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

Person.in_batches.each do |relation|
  relation.update_all(awesome: true)
end
each_record (&block) Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 53
def each_record(&block)
  return to_enum(:each_record) unless block_given?

  @relation.to_enum(:in_batches, of: @of, start: @start, finish: @finish, load: true, cursor: @cursor, order: @order).each do |relation|
    relation.records.each(&block)
  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
touch_all (...) Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 86
def touch_all(...)
  sum do |relation|
    relation.touch_all(...)
  end
end

Обновляет временные метки записей пакетами. Возвращает общее количество затронутых строк.

Person.in_batches.touch_all

Подробные сведения об обновлении временных меток каждого пакета см. в описании Relation#touch_all.

update_all (updates) Показать исходный код
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 75
def update_all(updates)
  sum do |relation|
    relation.update_all(updates)
  end
end

Обновляет записи пакетами. Возвращает общее количество затронутых строк.

Person.in_batches.update_all("age = age + 1")

Подробные сведения об обновлении каждого пакета см. в описании Relation#update_all.

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

Spec-Zone.ru

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