Ruby on rails 4 通过活动作业处理依赖的销毁

Ruby on rails 4 通过活动作业处理依赖的销毁,ruby-on-rails-4,rails-activejob,dependent-destroy,Ruby On Rails 4,Rails Activejob,Dependent Destroy,我有两个模特,有很多孩子。依赖性破坏变得非常严重。有人知道如何将依赖性工作与活动工作联系起来吗?或者,我唯一的选择是通过父模型上的回调来删除依赖的销毁和角色我自己的作业吗?Rails本机不这样做。然而,这个gem在修复与dependent::destroy相关的N+1方面做得很好。它实际上使用dependent::delete_all,但使用它的方式是删除所有子类。而且,每个类只需对DB进行2次点击即可完成。我不敢相信这样的功能没有包装到rails核心中 您可以创建一个worker来异步销毁模型

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

Rails本机不这样做。然而,这个gem在修复与dependent::destroy相关的N+1方面做得很好。它实际上使用dependent::delete_all,但使用它的方式是删除所有子类。而且,每个类只需对DB进行2次点击即可完成。我不敢相信这样的功能没有包装到rails核心中

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

class ComplexModelDeletion < ActiveJob::Base
  def perform(model)
    model.destroy!
  end
end
class Model < ActiveRecord::Base
  def destroy_later
    ComplexModelDeletion.enqueue(self)
  end
end
class ComplexModelDelete
模型可以是这样的:

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


不确定这是否可以正常工作,但只是想让您知道可以做些什么。

对于v6.1.0,Rails现在具有本机支持。您可以向关系中添加一个
dependent::destroy\u async
,rails将在后台处理删除操作。请参阅此处的日志-

您是否考虑过将模型标记为已销毁,并实际从数据库异步删除它们?您的意思是将子对象排队以便在作业中销毁?这就是我正在做的。ActiveJob是相当新的…也许有一天会有一种rails方法来处理dependent::destroy async,并使用一个简单的关联选项。目前,我正在将每个子模型排队销毁,并使用孤立的父对象id作为标记。我通常不会从数据库中删除记录,因为删除操作的伸缩性不好。大多数情况下,将记录标记为已删除并保留在那里更便宜。