web-dev-qa-db-ja.com

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

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

アプリの「discogs」スキーマからモデルをセットアップするにはどうすればよいですか? Sunspotを使用して、Solrにこれらのモデルのインデックスを作成させます。どのようにこれを行うかはわかりません。

64
Johan

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

役に立てば幸いです。

101
Felsangom

Rails 4.2の正しいものは次のとおりです。

class Foo < ActiveRecord::Base
  self.table_name = 'myschema.foo'
end

詳細- http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-table_name-3D

12
Lalu

ただやる

class Foo < ActiveRecord::Base
  set_table_name 'myschema.foo'
end
10
maniek

移行の場合:

class CreateUsers < ActiveRecord::Migration
  def up
    execute 'CREATE SCHEMA settings'
    create_table 'settings.users' do |t|
      t.string :username
      t.string :email
      t.string :password

      t.timestamps null: false
    end
  end

  def down
    drop_table 'settings.users'
    execute 'DROP SCHEMA settings'
  end

end

モデルでオプション

class User < ActiveRecord::Base
  self.table_name 'settings.users'
end
9

set_table_nameが削除され、self.table_nameに置き換えられたためです。

次のようにコードに従う必要があると思います:

class Foo < ActiveRecord::Base
  self.table_name =  'myschema.foo'
end
8
Khanh Pham

方法 set_table_nameは削除されました。 self.table_name 正常に動作します。

1
zhulinpinyu