【问题标题】:How to get original attribute for a model with paper trail如何获取带有纸迹的模型的原始属性
【发布时间】:2017-07-27 14:17:21
【问题描述】:

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

获取当前值:widget.name

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

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

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

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

【问题讨论】:

  • 如果没有reify,你就会陷入解析的困境。但是,如果您只是在寻找原始名称,则可以使用元数据在语法上完成您想要的操作,请参阅 github.com/airblade/paper_trail#4c-storing-metadata ... 本质上创建一个 original_name 元数据属性并在创建时存储。然后,您可以将它作为版本对象上的一流函数使用:widget.versions.first.original_name。但是,如果您不只是追求名称,我认为这将比解析更乏味。

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


【解决方案1】:

我不想这样做:

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

丑陋但效果很好。猴子可以把它打补丁到paper_trail 来清理它

【讨论】:

    【解决方案2】:

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

    Github repo 上有一个关于 reifyclosed issue 返回 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

    如果你想要它,请给它一个赞成票。

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2021-10-02
      • 2023-03-11
      • 2017-06-10
      • 1970-01-01
      • 2021-03-19
      相关资源
      最近更新 更多