通过活跃的工作处理相关的销毁

Handle dependent destroy via active jobs

我有几个模型有很多 children。依赖破坏变得非常沉重。任何人都知道将依赖破坏与活跃工作联系起来的方法吗?或者,我唯一的选择是通过 parent 模型上的回调删除依赖销毁和角色我自己的工作吗?

Rails 本身不会这样做。但是,这个 gem 很好地修复了与 dependent: :destroy 相关的 N+1。它实际上使用 dependent: :delete_all,但使用它的方式是所有子 classes 也被删除。而且,它只使用每个 class 对数据库的 2 次点击。我不敢相信这样的功能没有包含在 rails 核心中。 https://github.com/jisaacks/recurse-delete

您可以创建一个 worker 来异步销毁模型并将其删除排队。类似于:

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 将其入队。您甚至可以在将对象加入队列之前将其标记为 deleted,以防止在实际被杀死之前从数据库中检索它。

不确定这是否可行原样,但只是让您了解您可以做什么。

在 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/