51

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

私のアプリで 'discogs'スキーマからモデルを設定するにはどうすればよいですか?私はSunspotを使って、Solrがこれらのモデルのインデックスを作成させるようにします。私はあなたがこれをどうやってやるのか分からない。

+2

db:create rakeタスクを使用してデータベースを設定するときに、どのように非公開スキーマを作成しますか? template1データベースにスキーマを追加することは可能です。しかし、通常のレール/レーキ開発プロセスの一環としてそれを行う方法はありますか? – TsenYing

+0

@TsenYing [pg_power gemがあります](http://stackoverflow.com/a/18227887/673826)は1つのオプションです。その[home is here](https://github.com/TMXCredit/pg_power)です。それは2年のために更新されていません。もう一つのオプションは* db *名前空間に* create * rakeタスクを書いてそこにあなたのものを追加することかもしれません。 – mlt

答えて

82

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" 

二つのモデル作成:

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 

私はそれが助けてくれることを願っています。

+7

存在しない表の問題を避けるために、*スキーマクラスにself.abstract_class = trueを追加する必要があります。 –

8

ちょうど削除されていset_table_name

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

方法を実行します。 self.table_nameはうまく動作します。

6

set_table_nameが削除され、self.table_nameに置き換えられました。

私はあなたに従うコーディングすべきだと思う:

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

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 
関連する問題