16

我认为在销毁记录时使用“撤消”方法 ala gmail而不是显示一个恼人的弹出窗口,上面写着“你确定吗? ”,这一点很重要。

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

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

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

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

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

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

4

5 回答 5

4

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

以下是似乎与您的描述相匹配的插件的链接和摘要:

  1. 充当偏执狂:让您的活动记录“偏执”。删除它们不会删除该行,而是设置一个 deleted_at 字段。Find 被重载以跳过已删除的记录。
  2. 充当软删除:提供软删除 ActiveRecord 模型的能力。
于 2008-10-14T16:31:49.523 回答
0

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

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

于 2008-10-14T08:46:36.373 回答
0

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

于 2008-10-14T15:08:04.390 回答
0

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

于 2013-07-11T15:03:55.050 回答
-1

责任链模式

class Action
{
  Perform(context);
  Undo(context);
}
于 2008-10-14T08:48:35.467 回答