【发布时间】:2024-01-07 18:41:01
【问题描述】:
这是我的模型的样子,所以我可以正确解决我的问题
class Product
has_paper_trail
belongs_to :category
end
在我的 HTML 方面,我需要使用 PaperTrial 版本加载所有日志。像这样
@product.versions.each |version|
version.changeset.each do |k, v|
- if k.to_s == "category_id"
- old_record = v[0].blank? ? " No Record " : Category.find(v[0].to_i).name
- new_record = v[1].blank? ? " No Record " : Category.find(v[1].to_i).name
= "Category" + " From: " + "#{old_record} " + " To: " + "#{new_record}"
在我的 HTML 中看起来不错,但是。有一个场景。该类别将被删除。我会在这个视图中得到一个错误。因为我的“Category.find”。 find 方法找不到已删除的 Category。
有没有办法存储类别名称而不是 ID。所以我可以摆脱使用“查找”
或者有更好的方法来实现这些东西?
【问题讨论】:
-
如果您想保留已删除类别数据的历史记录(例如类别名称),那么您也应该软删除类别。如果
products表只存储category_id,而不是category_name,那么您就没有记录该数据。 -
当然,另一种选择是对数据库进行非规范化 - 所以
categories.name也存储在products.category_name中。但这并不理想,因为现在您需要复制信息并担心诸如“如果类别更改名称怎么办,那么我需要在其他地方更新所有这些重复的数据字段”。 -
我的意思是您可以有两个数据库列:
products.category_id和products.category_name。这意味着名称将被存储在不同的地方,而不是一个地方。从好的方面来说,这是一种存储产品历史记录的简单方法,但在不利方面,您会复制数据 - 并且存在两个表之间的值不同步的风险。 -
或者... 就像我说的,你需要软删除
categories和products。这样您仍然可以检索已删除的类别数据,例如名称。 -
@DeezNuuts 当通过 Active Record(Ruby on Rails 打包的默认 ORM 库)删除记录时,不是实际从数据库中删除记录,而是使用删除时间填充 deleted_at 列
标签: ruby-on-rails ruby ruby-on-rails-5 ruby-on-rails-6 paper-trail-gem