【问题标题】:What's the best way to implement gmail style "undo" in Rails?在 Rails 中实现 gmail 样式“撤消”的最佳方法是什么?
【发布时间】:2010-09-17 01:18:25
【问题描述】:

我认为在销毁记录时使用“撤消”方法 ala gmail 而不是显示“您确定吗? ”。

我实现这一点的方式是在模型中有一个“deleted_at”时间戳列,当调用 destroy 方法时,该列会得到时间戳

def destroy
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, Time.now)
  ...
end

还原/撤消,我只需将同一列设置为零

def revert
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, nil)
  ...
end

当我调用 find 方法时,我只需要添加一个条件来过滤掉“已删除”的 foo。也许设置一个 cron 或后台任务在一段时间后真正销毁“已删除”的 foo。

对我有用且易于实现,但我很好奇是否有更好的方法来实现此功能?也许有一个我不知道的插件或 gem 提供了这个?

【问题讨论】:

  • 你真的在乎它什么时候被删除吗?一个标志还不够吗?
  • 是的,我现在不在乎它何时被删除,但这些知识可能会很有用。无论如何,我认为时间戳是一个很好的标志。
  • 我同意一般观点。然而,先发制人的需求的一个可能问题是,它可能会欺骗其他开发人员搜索当前使用该(时间戳)信息的位置。当它实际上没有在某个地方使用时,它代表一个松散的线程,这对于初学者来说通常是令人沮丧和耗时的。

标签: ruby-on-rails activerecord gmail undo revert


【解决方案1】:

确实有一些插件可以在Agile Web Development找到。

以下是与您的描述相符的插件的链接和摘要:

  1. Acts as Paranoid:让你的 Active Records “偏执”。删除它们不会删除该行,而是设置一个 deleted_at 字段。 Find 被重载以跳过已删除的记录。
  2. Acts as soft deletable:提供软删除 ActiveRecord 模型的能力。

【讨论】:

  • 似乎 Acts As Paranoid 可能对 ActiveRecord 的未来版本有一些问题,因为它覆盖了 find 方法。充当软删除看起来不错。我只是想知道如果 deleted_table 不同步,我该如何重新同步它?你以前用过吗?
  • 不,但是在软删除的描述中它说它内置了帮助方法来保持它们同步
  • 对这两者的简要回顾使得 Acts as soft deletable 似乎是更好的选择,无论是使用的方法还是它似乎得到更好的维护。
【解决方案2】:

有一个文件here 似乎可以满足您的要求,但我个人认为必须有一些东西可以自动过滤掉已删除的记录,除非您特别包含它们。这样,除非您包含重新包含它们的参数或命名范围,否则它们实际上会显示为已删除。

可惜我没写过,业余时间有限,不过应该没那么难吧?

【讨论】:

    【解决方案3】:

    您可以将已删除的项目移动到单独的集合(或表格,或其他任何内容)中 - 然后在原始列表中查看的任何内容都会看到它已被删除,并且您可以在方便时处理新列表。

    【讨论】:

      【解决方案4】:

      PaperTrail 做得很好。上面有一个很好的Railscast,虽然现在有点旧了。我知道这个问题是很久以前提出的,但出于好奇,我偶然发现了它,并认为我应该参考一个很好的最新方法。

      【讨论】:

        【解决方案5】:

        责任链模式

        class Action
        {
          Perform(context);
          Undo(context);
        }
        

        【讨论】:

        • 这是非常模糊的,并没有让我知道如何实际执行撤消操作。上下文是什么?它如何与数据库交互?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多