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