ruby 是否可以在没有后续插件的情况下恢复PaperTrail中的版本更改?

toe95027  于 11个月前  发布在  Ruby
关注(0)|答案(1)|浏览(97)

我有一个Rails项目,它的模型使用paper_trail gem进行版本化。
我希望有,当我恢复一个版本,我只想改变在该特定版本中被更改的字段被还原,而不是撤消版本的不同字段的变化后.
例如,假设我有一个Person模型,其字段为:name、favorite_color和age。

# Let's say this doesn't create any version
Person.create(name: 'John', age: 20, favorite_color: 'Green') 

# This creates a version (V1) with the changeset: 20 => 21
Person.update_attributes(age: 21)

# This creates another version (V2) with the changeset: 'Green' => 'Blue'                
Person.update_attributes(favorite_color: 'Blue')

# This creates another version (V3) with the changeset: 'John' => 'James'
# This is also the latest version now
Person.update_attributes(name: 'James')

字符串
我正在寻找的功能是,如果我恢复到V1,那么Person的年龄回到20岁,我不想撤消之后的更改(即最喜欢的颜色更改和名称更改)。所以我想更好的说法是我只想撤销特定的字段更改。(在这种情况下,Personage: 20favorite_color: 'Blue'name: 'James')。
我觉得这应该是PaperTrail已经支持的东西。我扫描了文档和代码,沿着沿着这些行,搜索谷歌,看看过去的问题,但还没有找到任何东西。

所以我的真实的问题是:我错过了它,或者这只是PaperTrail不支持的东西?

在我发现PaperTrail是否真的支持这一点之前,我已经扩展了PaperTrail::Version,用一个名为revert的函数来支持这一点。
下面是代码,如果你感兴趣的话:

# app/models/paper_trail/version.rb

module PaperTrail
  class Version < ActiveRecord::Base
    include PaperTrail::VersionConcern

    def revert
      item = self.item
      item_attributes = {}

      self.changeset.keys.each do |k|
        item_attributes[k] = self.changeset[k][0]
      end

      item.assign_attributes(item_attributes)
      item
    end
  end
end

vvppvyoh

vvppvyoh1#

当我这样做的时候:

some_record.paper_trail.previous_version.save

字符串
已创建具有所需状态的新版本。未覆盖/替换中间版本。

相关问题