除非在每个模型中声明has_paper_trail
,否则我认为没有一种简单的方法可以将PaperTrail应用于所有模型。
我想要实现的是将PaperTrail(或其他gem,如Auditable,Vestal Versions)的功能应用于所有模型。例如,我想要包含由宝石和引擎生成的模型(Rails 3)。
有关如何应用“全球”PaperTrail(或类似宝石)的任何指示?
答案 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
。