对于我目前正在处理的一个项目,我需要实现对象版本控制。不幸的是,我需要保存每个对象的完整历史记录,因此像Papertrail这样的单表解决方案很快就会变得难以管理。然而,有一些我喜欢的书面记录的功能,我在每个模型都有单独的表的解决方案中找不到(比如acts_as_versioned)。
跟踪更改的强大方法
还有一些书面记录没有的功能,这些功能将是额外的:
我目前正在考虑对每个模型使用单独的表格,但如果有现有的解决方案,我想省去这方面的工作。
更新:默认情况下, Vestal版本使用单个表,但是通过为每个模型提供一个自定义版本类并使用ActiveRecord的"set_table_name“方法,我能够为每个模型创建单独的表。Vestal版本也有内置的diff支持,尽管它的界面没有Papertrails那么强大。它也缺乏关联支持。
更新2: As papertrail似乎是一个更活跃的项目,我已经在gem上创建了分支,并添加了类似于vestal版本的自定义类支持,现在可以为每个模型定义单独的表。我的fork在这里,但我希望它很快就会被拉到主项目存储库中。https://github.com/benzittlau/paper_trail
发布于 2011-10-29 22:07:45
您可以使用: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
这允许您将每个模型的版本存储在单独的表中,如果要创建大量版本,这将非常有用。
发布于 2011-03-18 10:49:12
我一直在使用Vestal Versions,这是一个使用memento模式创建历史表的rails gem/plugin,它在after_save和after_destroy回调中保存了不同的属性。
它还记录更改的时间,并递增版本号,以便您可以回滚到特定版本或在特定日期或时间存在的版本。
然后,我可以像这样拉出一个对象:
@user = User.last
@user.versions.last.changes #=> {:name => ['Robert','Bob']}
我是你的铁杆粉丝。
https://stackoverflow.com/questions/5346367
复制相似问题