Byt*_*eMe 7 activerecord ruby-on-rails
我有大量的 Product 对象,它们都有一个关联的“变体”。我不能只是delete_all
产品,因为我也需要删除关联。
当我使用Products.all.destroy_all
它时它会冻结并且没有完成销毁所有产品,然后它会迫使我取消它并将其回滚。
这个问题有方法解决吗?
对于大量对象及其关联的“变体”,您必须使用 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)
如果“变体”记录没有任何必须从数据库中删除的依赖项,则使用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 发生时您网站的用户会遇到一些严重的问题。
归档时间: |
|
查看次数: |
2738 次 |
最近记录: |