如何使用 gem PaperTrail 获取模型属性的原始值?



我有一个使用PaperTrail跟踪的模型。

我想将属性"name"的当前值与首次创建时的值进行比较。我可以轻松获取当前值。如何获取其原始值?

获取其当前值:widget.name

要获取其原始值:widget.versions.first.???.name

我知道widget.versions.first.changeset会返回一个哈希值,如下所示。

{
name: [nil, 'original name']
}

虽然,我不想解析它;一定有更好的方法来获取原始值。

第二个version上使用reify,如果不存在,则返回widget

有一个关于在 Github 存储库上返回reifynil的已关闭问题。它在那里被忽略了,但我认为这是一个非常有效的问题和一个常见的用例。

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中以清理它。

最新更新