提问人:FiFi 提问时间:11/13/2023 更新时间:11/15/2023 访问量:38
覆盖纸质记录上的object_changes,以存储与 ID 更改相对应的名称
Overriding object_changes on paper trails to store name corresponding to change in IDs
问:
对于关联,我将不同模型的 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没有被覆盖,那该怎么办?
正确的方法是什么?
答:
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_names
list_of_removed_company_names
评论