1. ホーム
  2. ruby-on-rails

Railsのモデルで複数のPostgreSQLスキーマを使用する

2023-11-06 20:09:31

質問

Railsアプリケーション用にPostgreSQLデータベースを持っています。public'という名前のスキーマに、主なRailsモデルのテーブルなどが格納されています。discogs'スキーマを作成しましたが、'public'スキーマと同じ名前のテーブルを持つことがあり、これがスキーマを使って整理している理由の1つです。

私のアプリで 'discogs' スキーマからどのようにモデルをセットアップしますか。私は、Sunspot を使用して、Solr にこれらのモデルのインデックスを作成させるつもりです。これをどのように行うか不明です。

どのように解決するのですか?

database.yml の PostgreSQL アダプタ schema_search_path で解決しましたか?

development:
  adapter: postgresql
  encoding: utf-8
  database: solidus
  host: 127.0.0.1
  port: 5432
  username: postgres
  password: postgres
  schema_search_path: "discogs,public"

また、スキーマごとに異なる接続を指定することも可能です。

public_schema:
  adapter: postgresql
  encoding: utf-8
  database: solidus
  host: 127.0.0.1
  port: 5432
  username: postgres
  password: postgres
  schema_search_path: "public"

discogs_schema:
  adapter: postgresql
  encoding: utf-8
  database: solidus
  host: 127.0.0.1
  port: 5432
  username: postgres
  password: postgres
  schema_search_path: "discogs"

各接続を定義した後、2つのモデルを作成します。

class PublicSchema < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :public_schema
end

class DiscoGsSchema < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :discogs_schema
end

そして、すべてのモデルはそれぞれのスキーマを継承します。

class MyModelFromPublic < PublicSchema
  set_table_name :my_table_name
end

class MyOtherModelFromDiscoGs < DiscoGsSchema
  set_table_name :disco
end

お役に立てれば幸いです。