通过活动作业处理依赖性破坏

时间:2015-03-21 04:08:56

标签: ruby-on-rails-4 rails-activejob dependent-destroy

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

3 个答案:

答案 0 :(得分:5)

您可以创建一个工作程序来销毁模型异步并将其排入队列。类似的东西:

class Model < ActiveRecord::Base
  def destroy_later
    ComplexModelDeletion.enqueue(self)
  end
end

模型可能是这样的:

Model#destroy_later

然后,每当您需要杀死此模型的实例时,您可以调用{{1}}将其排入队列。您甚至可以在将对象标记为已删除之前将其标记为排队,以防止它在实际被杀死之前从DB中检索。

不确定这是否会像一样,但只是为了让您了解自己可以做些什么。

答案 1 :(得分:2)

Rails本身不会这样做。但是,这个gem可以很好地修复与依赖的相关的N + 1 :: destroy。它实际上使用dependent :: delete_all,但是以一种所有子类都被删除的方式使用它。而且,每个类只使用2次点击数据。我无法相信这样的功能不会被包装到rails core中。 https://github.com/jisaacks/recurse-delete

答案 2 :(得分:0)

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