跳至内容 跳至搜索
方法
B
D
E
T
U
包含的模块

属性

[R] finish

BatchEnumerator 结束的 primary key 值,包含该值。

[R] relation

BatchEnumerator 生成批次的关联关系。

[R] start

BatchEnumerator 开始的 primary key 值,包含该值。

实例公共方法

batch_size()

BatchEnumerator 生成的批次的大小。

# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 28
def batch_size
  @of
end

delete_all()

批量删除记录。返回受影响的总行数。

Person.in_batches.delete_all

有关如何删除每个批次的详细信息,请参见 Relation#delete_all

# File activerecord/lib/active_record/relation/batches/batch_enumerator.rb, line 66
def delete_all
  sum(&:delete_all)
end

destroy_all()

批量销毁记录。返回受影响的总行数。

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

有关如何销毁每个批次的详细信息,请参见 Relation#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

each(&block)

为每批记录生成一个 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 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

each_record(&block)

遍历数据库中的一组记录(例如,使用 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 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

touch_all(...)

批量更新记录。返回受影响的总行数。

Person.in_batches.touch_all

有关如何更新每个批次的详细信息,请参见 Relation#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

update_all(updates)

批量更新记录。返回受影响的总行数。

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

有关如何更新每个批次的详细信息,请参见 Relation#update_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