批量销毁 Rails 活动记录中的所有内容

Byt*_*eMe 7 activerecord ruby-on-rails

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

当我使用Products.all.destroy_all它时它会冻结并且没有完成销毁所有产品,然后它会迫使我取消它并将其回滚。

这个问题有方法解决吗?

Kis*_*are 6

对于大量对象及其关联的“变体”,您必须使用 destroy_all。

Product.all.destroy_all
Run Code Online (Sandbox Code Playgroud)

由于 destroy_all 实际上加载了整个关系,然后一个一个地迭代销毁记录,你可以很容易地破坏你的内存垫圈。因此,让我们在默认情况下做正确的事情,默认情况下以 100 的批次执行此工作,并允许您指定批次大小,如下所示:destroy_all(batch_size: 100).

Product.destroy_all(batch_size: 100)
Run Code Online (Sandbox Code Playgroud)

或者

您可以使用in_batches

Product.in_batches(of: 200).destroy_all
Run Code Online (Sandbox Code Playgroud)

  • Product.destroy_all(batch_size: 100) 不再有效。Rails 5.0.0 版本中删除了 Conditions 参数。 (2认同)

Pha*_*iệt 5

如果“变体”记录没有任何必须从数据库中删除的依赖项,则使用dependent: :delete_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
Run Code Online (Sandbox Code Playgroud)

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