覆盖纸质记录上的object_changes,以存储与 ID 更改相对应的名称

Overriding object_changes on paper trails to store name corresponding to change in IDs

提问人:FiFi 提问时间:11/13/2023 更新时间:11/15/2023 访问量:38

问:

对于关联,我将不同模型的 ID 分配给我的模型,因此 ID 正在更改。Papertrail 跟踪这些更改,这是我object_changes的状态:

{
  "updated_at": [
    "2023-11-13T08:54:26.346Z",
    "2023-11-13T08:56:06.961Z"
  ],
  "paying_id": [
    "ID1",
    "ID1 new"
  ],
  "company_ids": [
    [
      "ID1",
      "ID2",
      "ID3",
      "ID4"
    ],
    [
      "ID1 new",
      "ID2 new",
      "ID3 new"
    ]
  ]
}

但是,在我看来,对于审核日志,我不想显示 ID,而是显示与这些 ID 对应的名称。现在,我正在使用 if 循环来查询名称并发送到视图。但一定有比这更好的方法。文档也反对覆盖object_changes,但如果object_changes没有被覆盖,那该怎么办?

正确的方法是什么?

Ruby-on-Rails 红宝石 Ruby-on-Rails-3 Rubygems Paper-Trail-gem

评论

0赞 James Hibbard 11/13/2023
我将创建一个帮助程序方法,用于在呈现审核日志时将这些 ID 转换为名称。此方法应从关联的模型中获取与 ID 对应的名称,然后将它们显示在视图中。
0赞 FiFi 11/13/2023
这就是我目前正在做的事情。但是,如果名称已被删除,那么我将无法显示它。

答:

0赞 mcfoton 11/15/2023 #1

我会保持日志原样,仅存储在日志中。我还会使公司记录可软删除,这意味着当公司被销毁时,它并没有真正从数据库中删除,而是在默认工作流中对 Rails “不可见”。您可以实现自己的软删除逻辑或使用其中一个宝石,即偏执狂ids

因为想象一下,如果现有公司的公司名称发生变化会发生什么?如果将公司名称作为字符串复制到其他地方,则最终会得到不一致的数据。

如果你真的想使用日志,你可以使用 meta 来存储公司的名称,以防字段发生变化。类似的东西company_ids

has_paper_trail(
    meta: {
      company_names: proc { |item| item.company_ids.changed? ? list_of_company names : nil }
    }
  )

但我不确定 or 在此范围内可用。这也将产生一个巨大的字符串,具体取决于公司的数量。另一种方法是存储带有两个键的哈希值,这在某种程度上更好,但仍然会产生数据重复。_changed?_previously_changed?list_of_added_company_nameslist_of_removed_company_names