ActionPushNativeに抽象基底クラス`Record`を導入
ActionPushNativeのDeviceモデルが、新たに導入されたActionPushNative::Recordを継承するようになりました。これにより、Active StorageやAction Textと同様のパターンでデータベース設定をカスタマイズできるようになります。
背景
ActionPushNativeは、これまでDeviceモデルが直接ApplicationRecordを継承していました。しかし、この設計ではDeviceのデータベース接続設定をアプリケーション全体とは独立して変更することが困難でした。#91では、Active StorageやAction Textで採用されているパターンに倣い、専用の抽象基底クラスを導入することで、この問題を解決しています。
技術的な変更
新たにActionPushNative::Recordクラスが追加され、Deviceモデルがこれを継承するように変更されました。
変更前:
module ActionPushNative
class Device < ApplicationRecord
include ActiveSupport::Rescuable
# ...
end
end
変更後:
module ActionPushNative
class Device < Record
include ActiveSupport::Rescuable
# ...
end
end
module ActionPushNative
class Record < ActiveRecord::Base
self.abstract_class = true
end
end
ActiveSupport.run_load_hooks :action_push_native_record, ActionPushNative::Record
ActionPushNative::RecordはActiveRecord::Baseを継承し、abstract_class = trueを設定することで抽象クラスとして機能します。また、ActiveSupport.run_load_hooksを呼び出すことで、ロードフック機構を有効化しています。
設計上の利点
この変更により、アプリケーション開発者は以下のようにActionPushNativeのデータベース設定を独立してカスタマイズできるようになります。
ActiveSupport.on_load(:action_push_native_record) do
connects_to database: { writing: :push_notifications, reading: :push_notifications }
end
これは、Active StorageがActiveStorage::Recordを通じてデータベース接続を管理しているのと同じパターンです。アプリケーション本体とは異なるデータベースを使用したい場合や、レプリケーション設定を個別に管理したい場合に有用です。