paper_trail gem保存版本,其中object_changes为nil

时间:2019-02-20 14:31:01

标签: ruby-on-rails ruby-on-rails-5 paper-trail-gem

我们刚刚开始使用PaperTrail gem,并且注意到sybase列的版本表中有75%的记录为nil。知道为什么会这样以及我们如何阻止它吗?

使用Rails 5.1和PaperTrail 10.1。

2 个答案:

答案 0 :(得分:0)

nil对象更改是由于跳过属性上的触摸事件所致。我想到的唯一解决方案是仅跟踪创建,更新和销毁的版本。

我还发现我们有重复的版本记录。通过将以下内容放在ApplicationRecord中,我们为所有模型打开了PaperTrail,如果从另一个继承了一个类,则会导致创建重复的版本。例如,如果您有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

答案 1 :(得分:0)

以@Scott的答案为基础,创建一个初始化程序,并设置PaperTrail的全局配置(仅限版本10+)以忽略:touch事件。

这正在数据库中创建数百万个不必要的版本。

# config/initializers/paper_trail.rb

PaperTrail.config.has_paper_trail_defaults = {
  on: %i[create update destroy]
}