如何使用纸质跟踪获取模型的原始属性

时间:2017-07-27 14:17:21

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

我有一个用纸质跟踪跟踪的模型。我需要将当前值与创建的模型值进行比较。到目前为止,我可以轻松获得当前价值。如何获得原版?

获取当前值:widget.name

获取原始文件:widget.versions.first.???.name

我知道widget.versions.first.changeset会返回这样的哈希:

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

但我不想解析它,必须有更好的方法

2 个答案:

答案 0 :(得分:0)

我不打算这样做:

original = widget.versions.where(event: 'create')[0].changeset['name'][1]

难看,但是效果很好。猴子可以将其修补到paper_trail中进行清理

答案 1 :(得分:0)

在第二个reify上使用version或返回widget(如果不存在)。

在Github存储库上有一个closed issue关于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上有一个开放的Issue / Feature请求,可以将original_version添加到核心库本身:

https://github.com/paper-trail-gem/paper_trail/issues/1204

如果要在其中投票,请给它投票。