Ruby on rails PaperTrial版本处理变更集错误

Ruby on rails PaperTrial版本处理变更集错误,ruby-on-rails,ruby,ruby-on-rails-5,ruby-on-rails-6,paper-trail-gem,Ruby On Rails,Ruby,Ruby On Rails 5,Ruby On Rails 6,Paper Trail Gem,这里是我的模型,看起来像这样,我可以适当地解决我的问题 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_re

这里是我的模型,看起来像这样,我可以适当地解决我的问题

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”。“查找”方法找不到已删除的类别

# console or migration
Category.find_each(&:save!)
有没有办法存储类别的名称而不是ID。这样我就不用使用“查找”了


或者有更好的方法来实现这些功能?

我建议在产品模型中添加
category\u name
属性以进行缓存

# migration
rails g migration AddCategoryNameToProducts category_name

# Product model
  before_validation :cache_category_name
  def cache_category_name
    self.category_name = category&.name if category_name != category&.name
  end
但是,如果您已经投入生产,则必须先填写数据。您无法填充已删除的数据

# console or migration
Category.find_each(&:save!)
此方案保留已删除的类别名称,此外,它将比许多
category.find
更有效


或者,您可以按照其他人的建议进行某种软删除。

如果您想保留已删除类别数据的历史记录(例如类别名称),那么您也应该软删除类别。如果
products
表仅存储
category\u id
,而不存储
category\u name
,则您没有保存该数据的记录。当然,另一个选项是对数据库进行反规范化,因此
categories.name
也存储在
products.category\u name
中。但这并不理想,因为现在您需要复制信息并担心“如果类别更改名称,那么我需要在其他位置更新所有这些重复的数据字段”之类的事情。我的观点是,您可以有两个数据库列:
products.category\u id
products.category\u name
。这意味着名称将被存储到位置,而不是一个。从好的方面来说,这是一种存储产品历史记录的简单方法,但从坏的方面来说,您可能会复制数据,并且存在两个表之间的值不同步的风险。或者。。。正如我所说,您需要软删除
类别
以及
产品
。通过这种方式,您仍然可以检索已删除的类别数据,例如名称。@DeezNuuts当通过Active record(Ruby on Rails打包的默认ORM库)删除记录时,与其从数据库中实际删除该记录,不如在deleted_at列中填入删除时间感谢您的解释。这启发了我。但是我刚刚开始我的产品模型。再来一杯怎么样。像你一样有很多。我会这样做的???这是一种可能性。它适用于一些参数。但是,如果项目让你偏离了很多,那么创建一个软删除解决方案可能会更容易、更好。因此,您只将模型标记为已删除,但它仍存在于数据库中。它可能需要对代码库进行更多更改,甚至可能需要一个新的gem。这是一个相当复杂的话题。我从这里开始:谢谢兄弟,稍后我会回到你的代码,阅读所有的文档。我需要休息。这个项目给了我新冠病毒