別個のデータベースを使用した PaperTrail のバージョン管理
概要
Papertrail を使用して、モデルの変更イベントを別のデータベースに記録しようとしています。
使っています レール 4.1.2
ルビー2.1
ペーパートレイル 4.0.0
以下は懸念事項に追加したコードです
module Foo
class Base < ActiveRecord::Base
end
class Version < Base
include PaperTrail::VersionConcern
end
class Topic < Base
has_paper_trail class_name: 'Foo::Version'
end
end
Foo::Base.establish_connection(:trail_development)
この Foo を topic.rb に含めました
class Topic < ActiveRecord::Base
include Foo
end
トピックを作成、編集、または削除しようとすると、機能しません。
参考 https://github.com/airblade/paper_trail/pull/289
解決策
Rails 6.0 以降では、次のように別のデータベースに接続する抽象 Version クラスを作成することでこれを行うことができます。
class AbstractVersion < PaperTrail::Version
self.abstract_class = true
connects_to database: { writing: :my_database, reading: :my_database }
end
class MyVersion < AbstractVersion
# Optional: specify a different table name.
# self.table_name = :my_versions
end
class Topic < ApplicationRecord
has_paper_trail versions: {
class_name: "MyVersion"
}
end
Rails では、別のデータベース接続を使用するには、モデルを抽象として定義する必要があります。
PaperTrail を使用すると、PaperTrail::Version 基本クラスを拡張することでカスタム Version クラスを定義できます。
これは、 has_paper_trail 呼び出しを追加するモジュールを作成することでさらに抽象化できます。