Rails中的对象版本控制,如Papertrail,但个别表

时间:2011-03-17 23:05:48

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

对于我目前正在进行的项目,我需要实现对象版本控制。不幸的是,我需要保留每个对象的完整历史记录,因此像Papertrail这样的单个表解决方案很快就会变得无法管理。然而,我喜欢Papertrail的功能,我在一个解决方案中找不到每个模型的单独表格(例如acts_as_versioned)。

  • 能够存储来自控制器和模型的元信息
  • 数据已序列化,因此架构更改不会修改版本表
  • 遍历版本的强大方法
  • 自动跟踪变更责任

还有Papertrail没有的一些功能可以带来奖金:

  • 内置版本差异支持
  • 差异而非完整版本

我目前正在考虑让Papertrail为每个模型使用单独的表,但是如果有现有的解决方案,我希望节省这些工作。

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

更新2: 由于papertrail似乎是一个更活跃的项目,我已经分叉了gem并添加了类似于版本的自定义类支持,现在允许为每个模型定义单独的表。我的叉子在这里,但我希望它很快就会被拉进主项目库。 https://github.com/benzittlau/paper_trail

2 个答案:

答案 0 :(得分:12)

您可以使用:class_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

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

答案 1 :(得分:0)

我一直在使用Vestal Versions,一个使用memento模式创建历史表的rails gem / plugin,它在after_save和after_destroy回调中保存了属性差异。

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

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

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

我是一个非常狂热的粉丝。