Ruby on rails 批量销毁rails中的所有活动记录

Ruby on rails 批量销毁rails中的所有活动记录,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有大量的产品对象,它们都有一个关联的“变体”。我不能只删除所有产品,因为我还需要删除关联 当我使用Products.all.destroy\u all时,它会冻结并没有完成销毁所有产品,然后它会强制我取消并回滚 是否有解决方案?如果“变体”记录没有任何必须从数据库中删除的依赖项,请使用dependent::delete\u all而不是dependent::destroy products_count = Product.count # Determine how many batches

我有大量的产品对象,它们都有一个关联的“变体”。我不能只
删除所有
产品,因为我还需要删除关联

当我使用
Products.all.destroy\u all
时,它会冻结并没有完成销毁所有产品,然后它会强制我取消并回滚

是否有解决方案?

如果“变体”记录没有任何必须从数据库中删除的依赖项,请使用
dependent::delete\u all
而不是
dependent::destroy

products_count = Product.count

# Determine how many batches need to be run
number_of_iterations = (products_count.to_f / 1000).ceil

(1..number_of_iterations).each do |i|
  Product.limit(1000).delete_all
end

处理大量数据时,最好批量删除。如果在单个事务中删除的行数超过5000行,则数据库将锁定。这意味着在事务期间,任何其他正在运行的进程都无法访问整个表。这可能意味着在发生删除操作时,站点用户会遇到一些严重问题。

对于大量对象及其关联的“变体”,您必须使用destroy\u all

Product.all.destroy_all
因为destroy_all实际上加载了整个关系,然后一个接一个地迭代销毁记录,所以很容易破坏内存。因此,让我们在默认情况下做正确的事情,并在默认情况下以100个批次完成这项工作,并允许您像这样指定批次大小:
destroy\u all(批次大小:100)。

您也可以批量使用

Product.in_batches(of: 200).destroy_all

非常感谢。我曾使用“限制”来逐步通过,但这更有意义。Product.destroy\u all(批量大小:100)不再有效。在Rails 5.0.0版本中删除了条件参数。实际上是一个更好的选择,因为您仍然可以。每个批次对应一个,并且语法更具表现力。
Product.in_batches(of: 200).destroy_all