paper_trail gem 保存版本 object_changes nil
paper_trail gem saving versions with object_changes nil
我们刚开始使用 PaperTrail gem 并注意到版本 table 中 75% 的记录的 object_changes
列为零。知道为什么会发生这种情况以及我们如何阻止它吗?
使用 Rails 5.1 和 PaperTrail 10.1。
零对象更改是由于跳过了属性上的触摸事件。我想出的唯一解决方案是只跟踪创建、更新和销毁的版本。
我还发现我们有重复的版本记录。我们通过将以下内容放入 ApplicationRecord
来为所有模型启用 PaperTrail,如果 class 从另一个继承而来,这会导致创建重复版本。即如果您有 class Foo < Bar
并执行 Bar.create
将创建 2 个相同的版本记录。
初始版本在 ApplicationRecord
def self.inherited(subclass)
super
subclass.send(:has_paper_trail)
end
最终版本
def self.inherited(subclass)
classes_to_skip = %w[Foo]
attributes_to_skip = [:bar_at]
on_actions = [:create, :update, :destroy]
super
unless classes_to_skip.include?(subclass.name)
subclass.send(:has_paper_trail, on: on_actions, ignore: attributes_to_skip)
end
end
在@Scott 的回答的基础上,创建一个初始化程序并设置 PaperTrail 的全局配置(仅限版本 10+)以忽略 :touch
事件。
这在我们的数据库中创建了数百万个不必要的版本。
config/initializers/paper_trail.rb
PaperTrail.config.has_paper_trail_defaults = {
on: %i[create update destroy]
}
我们刚开始使用 PaperTrail gem 并注意到版本 table 中 75% 的记录的 object_changes
列为零。知道为什么会发生这种情况以及我们如何阻止它吗?
使用 Rails 5.1 和 PaperTrail 10.1。
零对象更改是由于跳过了属性上的触摸事件。我想出的唯一解决方案是只跟踪创建、更新和销毁的版本。
我还发现我们有重复的版本记录。我们通过将以下内容放入 ApplicationRecord
来为所有模型启用 PaperTrail,如果 class 从另一个继承而来,这会导致创建重复版本。即如果您有 class Foo < Bar
并执行 Bar.create
将创建 2 个相同的版本记录。
初始版本在 ApplicationRecord
def self.inherited(subclass)
super
subclass.send(:has_paper_trail)
end
最终版本
def self.inherited(subclass)
classes_to_skip = %w[Foo]
attributes_to_skip = [:bar_at]
on_actions = [:create, :update, :destroy]
super
unless classes_to_skip.include?(subclass.name)
subclass.send(:has_paper_trail, on: on_actions, ignore: attributes_to_skip)
end
end
在@Scott 的回答的基础上,创建一个初始化程序并设置 PaperTrail 的全局配置(仅限版本 10+)以忽略 :touch
事件。
这在我们的数据库中创建了数百万个不必要的版本。
config/initializers/paper_trail.rb
PaperTrail.config.has_paper_trail_defaults = {
on: %i[create update destroy]
}