【问题标题】:Techniques for storing/retrieving historical data in Rails在 Rails 中存储/检索历史数据的技术
【发布时间】:2026-02-13 02:05:01
【问题描述】:

我正在寻找一些关于在事件发生时保存一些(不同)记录的快照的想法,例如用户从我的应用程序中获取文档,以便以后可以重新生成该文档。你推荐什么策略?我应该使用与具有当前值的表相同的表还是使用历史表?你知道任何可以帮助我完成任务的插件吗?请分享您的想法和解决方案。

【问题讨论】:

    标签: ruby-on-rails database database-design


    【解决方案1】:

    有几个插件可以做到这一点。

    Acts_audited
    

    作为已审核对象为所有可审核对象创建一个表,并且不需要更改现有表。您可以在每次更改时输入更改,并将更改存储为备注字段中的哈希值,即更改类型 (CRUD)。只需在应用程序控制器中使用一条语句指定要审核的模型,就可以很容易地进行设置。 回滚取决于您,但信息就在那里。因为存储的信息只是构建整个对象的更改,因此可能由于后续更改而变得困难。

    Acts_as_versioned
    

    设置起来有点复杂 - 您需要为每个要版本化的对象创建一个单独的表,并且您必须将版本 ID 添加到现有表中。回滚是非常容易的。 github 上有一些分支提供了自上一个版本以来的更改哈希,因此您可以轻松突出显示差异(这是我使用的)。我猜这是最流行的解决方案。

    我没有经验的:acts_as_revisable。下次我需要版本控制时,我可能会试一试,因为它看起来更复杂。

    【讨论】:

      【解决方案2】:

      我曾经这样做过一次。我们创建了一个新表,它的结构与我们想要记录的表非常相似,每当我们需要记录某些内容时,我们都会执行类似的操作:

      attr = object_to_log.attributes
      # Remove things like created_at, updated_at, other unneeded columns
      log = MyLogger.new(attrs)
      log.save
      

      不过,很有可能有插件/gem 可以做这样的事情。

      【讨论】:

        【解决方案3】:

        我用acts_as_versioned 来处理这样的事情。

        【讨论】:

        • 您的链接无法正常工作。它提示我转到此链接:github.com/technoweenie/acts_as_versioned/tree/master
        • 多么奇怪 - 这是链接中的确切 URL。如果您在 404 页面上时再次在地址栏中点击返回...它会转到正确的位置。 Github 今天正在发布,所以我怀疑事情会稳定下来。
        【解决方案4】:

        OP 已经一岁了,但我想我会在其中添加vestal_versions。它使用单个表来跟踪每个版本的序列化哈希。通过遍历变化的记录,模型可以恢复到任意时间点。

        在这篇文章中似乎是社区的最爱......

        【讨论】: