将PaperTrail应用于所有型号

Rai*_*DFW 3 activerecord ruby-on-rails paper-trail-gem

我不认为有一种简单的方法可以将PaperTrail应用于所有模型,除非has_paper_trail在每个模型中声明.我想做到的是利用PaperTrail的特征(或其他宝石一样,可审计,维斯塔版本)的所有车型.例如,我想包括由宝石和引擎生成的模型(Rails 3).

有关如何应用"全球"PaperTrail(或类似宝石)的任何指示?

Vik*_*ary 11

对于Rails 5.0+(如果app有ApplicationRecord类)

class ApplicationRecord < ActiveRecord::Base
  def self.inherited subclass
    super
    subclass.send(:has_paper_trail)
  end
end
Run Code Online (Sandbox Code Playgroud)

对于较旧的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
}
Run Code Online (Sandbox Code Playgroud)

(由于运算符优先级,使用{/}而不是do/end之后使用非常重要Module.new).