Techioz Blog

ActiveRecord 7: ORM モデル クラスを使用しない書き込みおよび読み取りロールの使用

概要

私はデータベースアクセスに ActiveRecord を使用するアプリケーションに取り組んでいますが、モデルクラスなどの ORM 機能は使用しません。クエリはすべてリテラル SQL と exec_query の呼び出しで作成されます。

データベースへの読み取り専用接続の使用を選択的にオプトインするために、ActiveRecord で複数のデータベースのサポートを使用したいと考えていますが、これを使用しないアプリケーションでこれを機能させる方法を見つけることができませんでした。モデルクラス。

(ドキュメントからの) モデル クラスを使用すると、次のような宣言を行うことができます。

class MyBaseModel < ActiveRecord::Base
    self.abstract_class = true

    connects_to database: { writing: :primary, reading: :primary_replica }
end

次に、次の例を使用して手動で読み取りコンテキストに切り替えます。

ActiveRecord::Base.connected_to(role: :reading) do
    SomeChildModel.find id
end

(書き込みに使用されるデフォルトのロールに加えて) 読み取りロールに使用するデータベース接続を宣言し、特定のコンテキスト (接続オブジェクトに対して exec_query 呼び出しを行う) でそのロールを使用することを選択できる方法はありますか?上記のように構成されたモデル クラスと同様に、コンテキストの内外を切り替えるときに、ActiveRecord がバックグラウンドで接続プールを正しく管理できるようにするには?

解決策

あなたの質問にはあなたの答えが含まれていると思います。ブロック内のコードを実行するだけです。

ActiveRecord::Base.connected_to(role: :reading) do
  # all code in this block will be connected to the reading role
end

クラスまたはモデルを参照するためにそのブロック内のコードを必要とするものは何もありません。

さらに詳しくはドキュメントから:

ドキュメントに従って、database.yml ファイルに追加のデータベースを定義するだけです。