我认为没有一种简单的方法可以将 PaperTrail 应用于所有模型,除非has_paper_trail
在每个模型中声明。我想要完成的是将 PaperTrail(或其他 gem,如 Auditable、Vestal 版本)的功能用于所有模型。例如,我想包含由 gems 和引擎(Rails 3)生成的模型。
关于如何应用“全球”PaperTrail(或类似的宝石)的任何指示?
我认为没有一种简单的方法可以将 PaperTrail 应用于所有模型,除非has_paper_trail
在每个模型中声明。我想要完成的是将 PaperTrail(或其他 gem,如 Auditable、Vestal 版本)的功能用于所有模型。例如,我想包含由 gems 和引擎(Rails 3)生成的模型。
关于如何应用“全球”PaperTrail(或类似的宝石)的任何指示?
对于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
您可以从 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
基本模型中的 。
您可以使用猴子补丁扩展 ActiveRecord::Base 模块:
# config/initializers/active_record_paper_trail.rb
class ActiveRecord::Base
has_paper_trail
end
可能会完成这项工作,取决于它是否可以在那时包含宝石......试试看