我有几个有很多孩子的模特。依赖破坏变得非常沉重。有人知道将依赖破坏与活跃工作联系起来的方法吗?或者,我唯一的选择是通过父模型上的回调删除依赖销毁并扮演我自己的工作吗?
3 回答
您可以创建一个工作人员来异步销毁模型并将其删除。就像是:
class ComplexModelDeletion < ActiveJob::Base
def perform(model)
model.destroy!
end
end
该模型可能类似于:
class Model < ActiveRecord::Base
def destroy_later
ComplexModelDeletion.enqueue(self)
end
end
然后,每当你需要杀死这个模型的一个实例时,你可以调用Model#destroy_later
它来排队。您甚至可以在将对象加入队列之前将其标记为已删除,以防止它在实际被杀死之前从数据库中检索。
不确定这是否会按原样工作,但只是为了让您了解您可以做什么。
Rails 本身并不这样做。然而,这个 gem 很好地修复了与依赖相关的 N+1s::destroy。它实际上使用了dependent::delete_all,但使用它的方式是所有子类也被删除。而且,它只使用每个类对 DB 的 2 次命中。我不敢相信像这样的功能没有被包裹到 Rails 核心中。 https://github.com/jisaacks/recurse-delete
在 v6.1.0 中,Rails 现在有了原生支持。您可以dependent: :destroy_async
向关系中添加一个,rails 将在后台处理删除。在此处查看博客 - https://weblog.rubyonrails.org/2020/10/3/this-week-in-rails-destroying-associations-asynchronously-interval-datatype-and-more/