将PaperTrail应用于所有型号

时间:2013-06-06 21:01:47

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

除非在每个模型中声明has_paper_trail,否则我认为没有一种简单的方法可以将PaperTrail应用于所有模型。 我想要实现的是将PaperTrail(或其他gem,如Auditable,Vestal Versions)的功能应用于所有模型。例如,我想要包含由宝石和引擎生成的模型(Rails 3)。

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

3 个答案:

答案 0 :(得分:11)

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非常重要。

答案 1 :(得分:1)

您可以使用monkeypatch扩展ActiveRecord :: Base模块:

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

可能做的工作,取决于它是否可以包含宝石......尝试并看到

答案 2 :(得分:1)

您可以从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