我有大量的Product对象,它们都有一个关联的“变体”。我不能只是delete_all
个产品,因为我还需要删除关联。
当我使用Products.all.destroy_all
它冻结并且没有完成销毁所有产品然后它迫使我取消它并将其回滚。
有解决方法吗?
答案 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