Применение PaperTrail ко всем моделям

Я не думаю, что есть простой способ применить PaperTrail ко всем моделям, кроме объявления has_paper_trail в каждой из них. Чего я хочу добиться, так это использовать функции PaperTrail (или другого драгоценного камня, например, Auditable, Vestal Versions) для всех моделей. Например, я хочу включить модели, сгенерированные драгоценными камнями и движками (Rails 3).

Любые указания о том, как применить «глобальный» PaperTrail (или аналогичный драгоценный камень)?


person RailinginDFW    schedule 06.06.2013    source источник
comment
Я использовал ту же идею, что и в ответе, но с небольшим обновлением (с использованием имени таблицы вместо имени класса, потому что у меня анонимный класс). gist.github.com/dmitry/b94860e44516e417f6f4   -  person Dmitry Polushkin    schedule 22.05.2014


Ответы (3)


Для Rails 5.0+ (если приложение имеет класс ApplicationRecord)

class ApplicationRecord < ActiveRecord::Base
  def self.inherited subclass
    super
    subclass.send(:has_paper_trail)
  end
end

Для старых версий Rails

# config/initializers/paper_trail_extension.rb 
ActiveRecord::Base.singleton_class.prepend Module.new {
  def inherited subclass
    super
    skipped_models = ["ActiveRecord::SchemaMigration", "PaperTrail::Version", "ActiveRecord::SessionStore::Session"]
    unless skipped_models.include?(subclass.to_s)
      subclass.send(:has_paper_trail)
    end
  end
}

(Важно, чтобы вы использовали {/}, а не do/end после Module.new из-за приоритета оператора).

person Vikrant Chaudhary    schedule 29.01.2014
comment
Кажется, этот метод больше не работает в PT 4.0 или, по крайней мере, требует некоторой осторожности, если у вас есть какие-либо ассоциации HABTM. (github.com/airblade/paper_trail/issues/657) - person Jared Beck; 02.12.2015
comment
Я не думаю, что проблема заключается не в том, что paper_trail находится в версии 4.0, а в отношениях HABTM, которые не поддерживаются paper_trail (как также отмечалось по этому вопросу). - person Vikrant Chaudhary; 03.12.2015
comment
Используя rails 5.0+, я не могу просто добавить has_paper_trail в ApplicationRecord? Вместо того, чтобы делать это определение? Я пробовал это, и это сработало хорошо, но я не буду, если это будет иметь какие-то плохие последствия... - person Miguel Corti; 04.04.2019
comment
Я бы также добавил метод для конфигурации бумажного следа. subclass.send(:has_paper_trail, paper_trail_config) и по умолчанию возвращает {}. Это позволяет вам легко переопределять параметры для каждого подкласса, когда вам это нужно. - person Nuclearman; 08.11.2019

Вы можете расширить модуль ActiveRecord::Base с помощью обезьяньего патча:

# config/initializers/active_record_paper_trail.rb
class ActiveRecord::Base
  has_paper_trail
end

Может сработать, зависит от того, может ли он включать драгоценный камень в этот момент... попробуйте и посмотрите

person Matt    schedule 06.06.2013
comment
спасибо Мэтт. Мне пришлось добавить определенный чек?(has_paper_trail. - person RailinginDFW; 08.06.2013
comment
на самом деле это не работает должным образом, потому что PaperTrail присоединяется к Active Record::Base, а не к моделям. Я оставлю ответ как принятый на данный момент. - person RailinginDFW; 10.06.2013

Вы можете просто наследовать все свои модели от класса MyModel (аналогично использованию ApplicationController)...

class Posts < MyModel
end

class Comments < MyModel
end

class MyModel < ActiveRecord::Base
     self.abstract_class = true

     has_paper_trail
end

Не забудьте self.abstract_class = true в базовой модели.

person Hopstream    schedule 07.01.2014