编辑paper_trail版本而不创建新版本

时间:2015-07-23 04:00:26

标签: ruby-on-rails paper-trail-gem

我在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吗?

1 个答案:

答案 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的实例。

相关问题