класс ActiveRecord::Batches::BatchEnumerator
Атрибуты
Значение первичного ключа, на котором заканчивается BatchEnumerator, включая это значение.
Связь, из которой BatchEnumerator возвращает порции данных.
Значение первичного ключа, с которого начинается BatchEnumerator, включая это значение.
Открытые методы экземпляра
# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 28 def batch_size @of end
Размер порций, возвращаемых BatchEnumerator.
# 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 для деталей о том, как каждая порция удаляется.
# 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 для деталей о том, как каждая порция удаляется.
# 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
# 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
# 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 для деталей о том, как каждая порция обновляется.
# 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.