批量销毁所有在rails活动记录中

时间:2018-02-07 02:25:06

标签: ruby-on-rails activerecord

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

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

有解决方法吗?

2 个答案:

答案 0 :(得分:1)

如果"变种"记录没有任何必须从数据库中删除的依赖项使用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

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

答案 1 :(得分:1)

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

Product.all.destroy_all

由于destroy_all实际上会加载整个关系,然后逐个迭代地破坏记录,因此您可以非常轻松地删除内存垫片。因此,默认情况下让我们做正确的事,默认情况下以100为批次进行此工作,并允许您指定批次大小,如下所示:destroy_all(batch_size: 100).

Product.destroy_all(batch_size: 100)

OR

您还可以使用 in_batches

Product.in_batches(of: 200).destroy_all