我有一个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岁,我不想撤消之后的更改(即最喜欢的颜色更改和名称更改)。所以我想更好的说法是我只想撤销特定的字段更改。(在这种情况下,Person
与age: 20
,favorite_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
型
1条答案
按热度按时间vvppvyoh1#
当我这样做的时候:
字符串
已创建具有所需状态的新版本。未覆盖/替换中间版本。