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

我实现此方法的方法是使用“deleted_at”。模型中的timestamp列,当调用 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或后台任务来真正破坏“删除”。经过一段时间后,我们不知所措。

适合我,易于实施,但我很好奇是否有更好的方法来实现此功能?也许有一个插件或宝石提供我不知道的?

有帮助吗?

解决方案

确实有一些插件可以在敏捷网站开发中找到。

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

  1. 充当偏执狂:让您的活动记录“偏执。”删除它们不会删除该行,但会设置deleted_at字段。查找重载以跳过已删除的记录。
  2. 充当软删除功能:提供软删除ActiveRecord模型的功能。

其他提示

此处的文件似乎有效您需要什么,但我个人认为必须有一些东西可以自动过滤掉已删除的记录,除非您明确包含它们。这样,除非您包含一个重新包含它们的参数或命名范围,否则它们确实会被删除。

不幸的是,我没有写过一篇,而且业余时间有限,但不应该那么难,应该吗?

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

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

责任链模式

class Action
{
  Perform(context);
  Undo(context);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top