我有一个使用PaperTrail跟踪的模型。
我想将属性"name"的当前值与首次创建时的值进行比较。我可以轻松获取当前值。如何获取其原始值?
获取其当前值:widget.name
要获取其原始值:widget.versions.first.???.name
我知道widget.versions.first.changeset
会返回一个哈希值,如下所示。
{
name: [nil, 'original name']
}
虽然,我不想解析它;一定有更好的方法来获取原始值。
第二个version
上使用reify
,如果不存在,则返回widget
。
有一个关于在 Github 存储库上返回reify
nil
的已关闭问题。它在那里被忽略了,但我认为这是一个非常有效的问题和一个常见的用例。
做widget.versions.first.reify
回报nil
所以我能找到的最好的方法是:
widget.versions.second.reify
但是,当对象没有任何更改时,这不起作用。所以你需要一个nil
在那里签到:
widget.versions.second&.reify || widget
这将查找第二个版本,如果存在,将调用reify
,返回原始对象。如果它不存在,它将简单地返回widget
本身。
如果你想清楚它,你可以把它作为一个方法添加到类中:
# Returns the original version of this object or just this object if there has been no changes.
def original_version
self.versions.second&.reify || self
end
我有一个未解决的问题/功能请求 PaperTrail 以将original_version
添加到核心库本身:
https://github.com/paper-trail-gem/paper_trail/issues/1204
如果你想要它在那里,给它一个赞成票。
你也可以做的事情(有点笨拙,不能在所有用例上工作(是:
class MyModel
has_paper_trail on: [:touch]
after_save { touch }
end
那边:
- 您的版本中有创建版本
- 您的版本中有实时版本
- 但是你不能再利用版本#event了(它将永远是"触摸"(
以下代码行最终解决了该问题。
original = widget.versions.where(event: 'create')[0].changeset['name'][1]
它很丑,但它有效!我可以将其"猴子修补"到PaperTrail中以清理它。