【问题标题】:Handle dependent destroy via active jobs通过活动作业处理依赖销毁
【发布时间】:2015-05-24 14:33:47
【问题描述】:

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

【问题讨论】:

  • 您是否考虑过将模型标记为已销毁并实际从数据库中异步删除它们?
  • 你的意思是让孩子排队等待破坏工作?这就是我正在做的事情。 ActiveJob 是相当新的......也许有一天会有一种 Rails 方式来处理依赖: :destroy async 与一个简单的关联选项。现在,我将每个子模型排队等待销毁,并使用孤立的 parent_id 作为标签。
  • 我通常不会从数据库中删除记录,因为删除操作不能很好地扩展。大多数情况下,将记录标记为已删除并将它们留在那里更便宜。

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


【解决方案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/

【讨论】:

    【解决方案2】:

    您可以创建一个工作线程来异步销毁模型并将其排入队列中以进行删除。比如:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 2013-01-22
        • 1970-01-01
        相关资源
        最近更新 更多