3

各モデルで宣言する以外に、すべてのモデルに PaperTrail を適用する簡単な方法はないと思いますhas_paper_trail。私が達成したいのは、PaperTrail (または Auditable、Vestal Versions などの別の宝石) の機能をすべてのモデルに活用することです。たとえば、gem とエンジン (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/endModule.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 に答える