【问题标题】:cascade delete (soft and hard delete) ruby级联删除(软删除和硬删除)红宝石
【发布时间】:2018-03-30 13:47:29
【问题描述】:

所以问题来了: 硬删除很明显,您破坏了父级,而子级应该被破坏。并使用dependent: :destroy 因为它工作正常,当父母被摧毁时,孩子也会被摧毁。

关于软删除的混淆。如果我想软删除用户并且为此我想更新用户deleted_at: Time.now 中的一个字段。它被称为软删除,但是当我更新 deleted_at 字段时,我想销毁/取消用户的所有关联/依赖。

不使用任何 gem 怎么可能。

【问题讨论】:

  • 使用 gem 有什么问题?这是一个不平凡的问题,但paranoia 库是一个广泛使用且全面的解决方案。
  • 在我的职业生涯中,我看到了许多试图重新发明这个轮子的有缺陷的尝试;我的建议是只使用图书馆!

标签: ruby-on-rails ruby cascade soft-delete


【解决方案1】:

我建议您使用 gem,它可以处理所有棘手的情况,您自己的解决方案无法涵盖这些情况。

但是如果你不想在你的项目中有一个额外的库,那么你可以使用 ActiveRecord 回调来实现类似的东西。 尽管回调通常被视为不好的做法,但在这种情况下,它们可能会有所帮助。

你可以使用before_destroy回调http://api.rubyonrails.org/v5.1/classes/ActiveRecord/Callbacks.html 这将在调用模型destroy 方法之前触发。 在回调的主体中,您可以删除所有相关数据。

另外,不要忘记在模型定义中重写 destroy 方法,以将记录标记为已删除而不是真正删除。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 2010-10-05
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多