【发布时间】:2026-02-13 02:05:01
【问题描述】:
我正在寻找一些关于在事件发生时保存一些(不同)记录的快照的想法,例如用户从我的应用程序中获取文档,以便以后可以重新生成该文档。你推荐什么策略?我应该使用与具有当前值的表相同的表还是使用历史表?你知道任何可以帮助我完成任务的插件吗?请分享您的想法和解决方案。
【问题讨论】:
标签: ruby-on-rails database database-design
我正在寻找一些关于在事件发生时保存一些(不同)记录的快照的想法,例如用户从我的应用程序中获取文档,以便以后可以重新生成该文档。你推荐什么策略?我应该使用与具有当前值的表相同的表还是使用历史表?你知道任何可以帮助我完成任务的插件吗?请分享您的想法和解决方案。
【问题讨论】:
标签: ruby-on-rails database database-design
有几个插件可以做到这一点。
Acts_audited
作为已审核对象为所有可审核对象创建一个表,并且不需要更改现有表。您可以在每次更改时输入更改,并将更改存储为备注字段中的哈希值,即更改类型 (CRUD)。只需在应用程序控制器中使用一条语句指定要审核的模型,就可以很容易地进行设置。 回滚取决于您,但信息就在那里。因为存储的信息只是构建整个对象的更改,因此可能由于后续更改而变得困难。
Acts_as_versioned
设置起来有点复杂 - 您需要为每个要版本化的对象创建一个单独的表,并且您必须将版本 ID 添加到现有表中。回滚是非常容易的。 github 上有一些分支提供了自上一个版本以来的更改哈希,因此您可以轻松突出显示差异(这是我使用的)。我猜这是最流行的解决方案。
我没有经验的:acts_as_revisable。下次我需要版本控制时,我可能会试一试,因为它看起来更复杂。
【讨论】:
我曾经这样做过一次。我们创建了一个新表,它的结构与我们想要记录的表非常相似,每当我们需要记录某些内容时,我们都会执行类似的操作:
attr = object_to_log.attributes
# Remove things like created_at, updated_at, other unneeded columns
log = MyLogger.new(attrs)
log.save
不过,很有可能有插件/gem 可以做这样的事情。
【讨论】:
我用acts_as_versioned 来处理这样的事情。
【讨论】:
OP 已经一岁了,但我想我会在其中添加vestal_versions。它使用单个表来跟踪每个版本的序列化哈希。通过遍历变化的记录,模型可以恢复到任意时间点。
在这篇文章中似乎是社区的最爱......
【讨论】: