paper_trail gem сохраняет версии с object_changes nil

Мы только начали использовать гем PaperTrail и заметили, что 75% записей в таблица версий имеет нуль для столбца object_changes. Есть идеи, почему это происходит и как мы можем это остановить?

Использование Rails 5.1 и PaperTrail 10.1.


person Scott    schedule 20.02.2019    source источник


Ответы (2)


Основываясь на ответе @Scott, создайте инициализатор и установите глобальную конфигурацию PaperTrail (только версия 10+), чтобы игнорировать события :touch.

Это создавало миллионы ненужных версий в нашей базе данных.

config/initializers/paper_trail.rb

PaperTrail.config.has_paper_trail_defaults = {
  on: %i[create update destroy]
}
person sandre89    schedule 26.11.2019
comment
Это должно быть помечено как принятый ответ. Он прост в реализации и работает безупречно. - person Repolês; 17.12.2020

Изменения объекта nil связаны с событиями касания атрибутов, которые были пропущены. Единственное решение, которое я придумал для этого, — отслеживать версии только при создании, обновлении и уничтожении.

Я также обнаружил, что у нас есть повторяющиеся записи версий. Мы включили PaperTrail для всех моделей, поместив нижеследующее в ApplicationRecord, это привело к созданию дубликатов версий, если класс унаследован от другого. т.е. если у вас есть 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
person Scott    schedule 21.02.2019