0

我有一个具有 wiki 功能的多语言网站模型,其中包含我希望版本化的各种字段,但是我需要恢复对某些列而不是其他列所做的更改。

例如,我为每个模型实例存储了英文和西班牙文版本的书面指南。

想象:

  • 用户 A 编辑了西班牙语指南并添加了亵渎
  • 用户 B 稍后编辑英文指南并进行有用的更改。

通常版本控制意味着恢复用户 A 所做的更改也将恢复用户 B 以后的更改,尽管在我的情况下这是两个独立的问题。

所以我基本上需要有范围的版本历史。例如使用 papertrail:

#guide.rb
has_paper_trail :only => [:en_title, :en_body]
has_paper_trail :only => [:es_title, :es_body]

有什么最简单的解决方案吗?我真的不想为了实现这一点而将我的指南移动到具有一对一关系的单独模型中。

4

1 回答 1

1

尽管我会亲自将翻译提取到他们自己的模型中以避免这种情况,但您仍然应该能够在没有太多技巧的情况下实现这一目标。

每次更改记录时,PaperTrail 都会创建一个新的版本对象。每个版本都可以通过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 源代码中看到的内容工作。

它不是一个完美集成的解决方案,但它应该足以满足大多数需求。

于 2011-06-28T21:47:15.423 回答