我有一个具有维基功能的多语言网站的模型,其中包含我希望版本化的各种字段,但是我需要还原对某些列而不是其他列的更改。
例如,我为每个模型实例存储了英语和西班牙语版本的书面指南。
想象:
通常,版本控制意味着恢复用户A所做的更改也会在以后更改用户B的更改,尽管在我的情况下这些是两个独立的问题。
所以我需要基本上有范围版本的历史记录。例如,使用papertrail:
#guide.rb
has_paper_trail :only => [:en_title, :en_body]
has_paper_trail :only => [:es_title, :es_body]
对此最简单的解决方案?我真的不想将我的指南移动到具有一对一关系的单独模型中,只是为了达到这个目的。
答案 0 :(得分:1)
虽然我亲自将翻译提取到他们自己的模型中以避免这种情况,但你仍然可以在没有太多诡计的情况下实现这一目标。
每次更改记录时,PaperTrail都会创建一个新的Version对象。每个版本都可以通过object.versions
数组访问。
您必须想出一种方法来决定要还原哪个属性以及要将其还原到哪个版本。一旦你有这个,恢复它应该不是很困难。
例如,在您的模型中:
# Arguments:
# attr - Must respond to to_s with name of attribute to revert
# ver - Integer (e.g. -1 for previous version) or actual Version object
def revert_attribute(attr, ver)
ver = self.versions[ver] if ver.class == Integer
ver = ver.reify
self.write_attribute( attr, ver.read_attribute(attr) )
self.save
end
代码未经过测试或语法检查,但应该与我在PaperTrail源中看到的相同。
这不是一个完美的集成解决方案,但它应该足以满足大多数需求。