Ruby on rails Rails中的对象版本控制,如Papertrail,但为单个表

Ruby on rails Rails中的对象版本控制,如Papertrail,但为单个表,ruby-on-rails,versioning,database-versioning,Ruby On Rails,Versioning,Database Versioning,对于我目前正在进行的项目,我需要实现对象版本控制。不幸的是,我需要保存每个对象的完整历史记录,因此像Papertrail这样的单个表解决方案很快就会变得不可管理。不过,我喜欢Papertrail的一些特性,但在每个模型都有单独的表的解决方案中,我找不到这些特性(例如acts\U as\U版本) 能够存储来自控制器和模型的元信息 数据被序列化,因此架构更改不会修改版本表 遍历版本的强大方法 自动跟踪变更责任 还有一些Papertrail不具备的功能,这些功能可能是奖金: 内置版本差异支持 差

对于我目前正在进行的项目,我需要实现对象版本控制。不幸的是,我需要保存每个对象的完整历史记录,因此像Papertrail这样的单个表解决方案很快就会变得不可管理。不过,我喜欢Papertrail的一些特性,但在每个模型都有单独的表的解决方案中,我找不到这些特性(例如acts\U as\U版本)

  • 能够存储来自控制器和模型的元信息
  • 数据被序列化,因此架构更改不会修改版本表
  • 遍历版本的强大方法
  • 自动跟踪变更责任
还有一些Papertrail不具备的功能,这些功能可能是奖金:

  • 内置版本差异支持
  • 差异化而非完整版本
我目前正在考虑为每个模型使用单独的表格,但如果有一个现有的解决方案,我想节省这项工作

更新: Vestal版本默认使用单个表,但通过为每个模型提供自定义版本类并使用ActiveRecord的“set_table_name”方法,我能够为每个模型创建单独的表。Vestal版本还内置了diff支持,尽管其界面不如Papertrails强大。它也缺乏协会的支持

更新2: 由于papertrail似乎是一个更活跃的项目,我已经将gem分叉,并添加了类似于vestal版本的自定义类支持,现在它允许为每个模型定义单独的表。我的fork就在这里,但我希望它能很快被放到主项目存储库中。

我一直在使用一个rails gem/插件,它使用memento模式创建历史记录表,并在after_save和after_destroy回调中保存不同的属性

它还记录更改的时间并增加版本号,以便您可以回滚到特定版本或在特定日期或时间出现的版本

然后我可以像这样拉一个物体:

@user = User.last
@user.versions.last.changes #=> {:name => ['Robert','Bob']}

我是个超级粉丝。

您可以使用:class\u name选项指定自定义版本的子类:

class Post < ActiveRecord::Base
  has_paper_trail :class_name => 'PostVersion'
end

class PostVersion < Version
  # custom behaviour, e.g:
  self.table_name = :post_versions # in rails 2, use set_table_name
end
class Post'PostVersion'
结束
类后版本<版本
#习惯行为,例如:
self.table_name=:发布版本#在rails 2中,使用set_table_name
结束

这允许您将每个模型的版本存储在一个单独的表中,如果您创建了许多版本,这将非常有用。

Vestal版本与Papertrail一样,使用一个表来存储其版本对象,因此不适合我的应用程序,正如原始帖子中所解释的那样。为什么每个模型都需要一个单独的表?老式插件的作用与版本化的工作方式相同。每个模型都需要一个单独的表,因为所有版本化对象的一个表将很快增长到无法管理的大小,尤其是当我希望这个表能够被频繁地读写时,我们真的需要使用set_table_name吗?因为它是这个类的默认派生表名?PostVersion=>post_version如果您的类继承自AR::Base,则确实如此,但这里不是这种情况。在单个表中已经有一组历史记录之后,我可以开始使用不同的表吗?当然可以,只要迁移您关心的所有数据