gpt4 book ai didi

ruby-on-rails - 编辑 paper_trail 版本而不创建新版本

转载 作者:行者123 更新时间:2023-12-04 05:57:39 33 4
gpt4 key购买 nike

我在 Rails 3.2 应用程序上使用 paper_trail 3.0.8,我有一个名为“级别”的模型,我保留这些级别的版本。每个级别都有一个 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 而不在保存时创建新版本?

最佳答案

Is there anyway to update the cost_cents for an old version?



是的,但我知道的唯一方法是有点尴尬。
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 的实例.

关于ruby-on-rails - 编辑 paper_trail 版本而不创建新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31577927/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com