5

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

4

3 回答 3

5

您可以创建一个工作人员来异步销毁模型并将其删除。就像是:

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

不确定这是否会按原样工作,但只是为了让您了解您可以做什么。

于 2015-04-23T13:56:06.117 回答
2

Rails 本身并不这样做。然而,这个 gem 很好地修复了与依赖相关的 N+1s::destroy。它实际上使用了dependent::delete_all,但使用它的方式是所有子类也被删除。而且,它只使用每个类对 DB 的 2 次命中。我不敢相信像这样的功能没有被包裹到 Rails 核心中。 https://github.com/jisaacks/recurse-delete

于 2015-03-22T20:50:59.450 回答
1

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

于 2021-03-14T17:59:13.520 回答