Techioz Blog

別個のデータベースを使用した 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 呼び出しを追加するモジュールを作成することでさらに抽象化できます。