3

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

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

4

3 回答 3

13

对于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

于 2014-01-29T12:46:23.437 回答
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基本模型中的 。

于 2014-01-07T23:10:13.277 回答
1

您可以使用猴子补丁扩展 ActiveRecord::Base 模块:

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

可能会完成这项工作,取决于它是否可以在那时包含宝石......试试看

于 2013-06-06T21:04:23.600 回答