通过活动作业处理依赖销毁



我有几个带很多孩子的模型。依赖性破坏变得非常严重。有人知道将依赖性破坏与活跃工作联系起来的方法吗?或者,我唯一的选择是通过对父模型的回调来删除依赖的销毁并扮演我自己的工作吗?

您可以创建一个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将其入队。你甚至可以在入队前将对象标记为已删除,以防止在它真正被杀死之前从DB中检索它。

不确定这是否能像那样工作,但只是想让你知道你能做什么。

Rails本身并没有做到这一点。然而,这个gem很好地修复了与dependent::destroy相关的N+1。它实际上使用了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/

相关内容

  • 没有找到相关文章

最新更新