51

레일즈 애플리케이션을위한 PostgreSQL 데이터베이스를 가지고 있습니다. 'public'이라는 스키마에서 주요 Rails 모델 테이블은 저장됩니다. 'public'스키마와 같은 이름을 가진 테이블을 가진 'discogs'스키마를 만들었습니다. 그 이유 중 하나는 저는 이것을 조직화하기 위해 스키마를 사용하고 있습니다.여러 PostgreSQL 스키마를 레일즈 모델과 함께 사용

내 앱의 'discogs'스키마에서 모델을 설정하는 방법은 무엇입니까? 나는 Sunspot을 사용하여 Solr이 이러한 모델의 색인을 생성하도록 할 것입니다. 나는 당신이 어떻게 할 것인지 확신 할 수 없다.

+2

db : create rake 작업을 통해 데이터베이스를 설정할 때 비공개 스키마를 만드는 방법은 무엇입니까? template1 데이터베이스에 스키마를 추가하는 것도 가능합니다. 하지만 일반적인 레일/레이크 개발 프로세스의 일부로이 작업을 수행 할 수있는 방법이 있습니까? – TsenYing

+0

@TsenYing [There is pg_power gem] (http://stackoverflow.com/a/18227887/673826)은 하나의 옵션입니다. 그것의 [home is here] (https://github.com/TMXCredit/pg_power). 그것은 비록 2 년 동안 업데이 트되지 않았습니다. 또 다른 옵션은 * db * 네임 스페이스에 * create * rake 태스크를 작성하고 거기에 물건을 추가하는 것입니다. – mlt

답변

82

database.yml의 PostgreSQL 어댑터 schema_search_path가 문제를 해결합니까? 정의 된 각 연결 후

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" 

두 가지 모델 생성 :

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

또는 당신이 할 수있는 각 스키마에 대해 서로 다른 연결을 지정합니다

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

존재하지 않는 테이블 문제를 피하려면 * Schema 클래스에 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 

모델에서 선택 가능

관련 문제