我在Rails 3.2应用程序上使用paper_trail 3.0.8并且我有一个名为“' levels'我保留这些级别的版本。每个级别都有一个from_date和与之相关的成本。每当有人更改日期时,都会创建新版本。
我允许人们删除旧版本,如果他们想要,这种方法很有效。我希望能够修改旧的paper_trail版本并保存它而不创建新版本。
class Level < ActiveRecord::Base
has_paper_trail :only => [:from_date],
:if => Proc.new { |l|
l.versions.count == 0 || l.versions.first.item != nil && (l.versions.first.item.from_date.nil? || l.from_date > l.versions.first.item.from_date)
}
<snip code>
end
如果我执行以下操作,它只会更新当前级别而不是版本
level = Level.find 1
version=level.versions[1].reify
version.cost_cents = 1000
version.save
是否有更新旧版本的cost_cents?
还有一种方法可以在不保存新版本的情况下更新旧版本的from_date吗?
答案 0 :(得分:0)
是否有更新旧版本的cost_cents?
是的,但我知道的唯一方法有点尴尬。
PaperTrail::Version
是一个普通的ActiveRecord
对象,因此在这个意义上很容易使用,但是数据是序列化的(默认情况下是YAML),所以你必须反序列化,做出改变,并重新序列化。
v = PaperTrail::Version.last
hash = YAML.load(v.object)
hash[:my_attribute] = "my new value"
v.object = YAML.dump(hash)
v.save
使用ActiveRecord的自动序列化功能(如ActiveRecord::AttributeMethods::Serialization
)可能有更好的方法。
PS:我发现您正在尝试使用reify
,它会返回模型的实例,而不是PaperTrail::Version
的实例。