如何解决Rails模型版本化-一种具有独立版本列的模型
|| 我有一个具有Wiki功能的多语言网站模型,其中包含我希望对其进行版本控制的各个字段,但是我需要还原对某些列所做的更改,而不是对其他列所做的更改。 例如,我为每个模型实例存储英语和西班牙语版本的书面指南。 想像: 用户A编辑西班牙语指南并添加亵渎 用户B随后编辑英语指南并进行了有用的更改。 通常,版本控制意味着还原用户A所做的更改也将还原用户B以后的更改,尽管在我看来,这是两个单独的问题。 因此,我基本上需要了解范围内的版本历史记录。例如,使用papertrail:#guide.rb
has_paper_trail :only => [:en_title,:en_body]
has_paper_trail :only => [:es_title,:es_body]
有没有最简单的解决方案?我真的不想仅仅为了实现这一目标而将我的指南移动到具有一对一关系的单独模型中。
解决方法
尽管我亲自将翻译内容提取到自己的模型中来避免这种情况,但是您仍然应该能够轻松完成这项工作。
每次更改记录时,PaperTrail都会创建一个新的Version对象。每个版本都可以通过“ 1”数组进行访问。
您将不得不想出一种方法来确定要还原的属性以及要将其还原到哪个版本。一旦有了这个,恢复它就不会很困难。
例如,在您的模型中:
# 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源码中看到的内容正常工作。
这不是一个完美的集成解决方案,但对于大多数需求来说应该足够了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。