51

Tôi có một cơ sở dữ liệu PostgreSQL cho ứng dụng Rails của mình. Trong lược đồ có tên là 'public', các bảng mô hình Rails chính được lưu trữ vv. Tôi đã tạo ra một lược đồ 'discogs' sẽ có các bảng có tên đôi khi giống như trong lược đồ 'công khai' - đó là một trong những lý do Tôi đang sử dụng lược đồ để tổ chức việc này.Sử dụng nhiều lược đồ PostgreSQL với các mẫu Rails

Tôi làm cách nào để thiết lập mô hình từ lược đồ 'discogs' trong ứng dụng của mình? Tôi sẽ sử dụng Sunspot để Solr cũng lập chỉ mục các mô hình này. Tôi không chắc chắn làm thế nào bạn sẽ làm điều này.

+2

Làm cách nào để tạo lược đồ không công khai khi thiết lập cơ sở dữ liệu thông qua lệnh db: tạo rake? Việc thêm lược đồ vào cơ sở dữ liệu template1 là một khả năng. Nhưng có cách nào để làm điều đó như là một phần của quá trình phát triển rails thông thường? – TsenYing

+0

@TsenYing [Có pg_power gem] (http://stackoverflow.com/a/18227887/673826) cho rằng đó là một tùy chọn. [Nhà của nó ở đây] (https://github.com/TMXCredit/pg_power). Nó đã không được cập nhật trong 2 năm mặc dù. Một tùy chọn khác có thể là viết tác vụ * create * rake trong không gian tên * db * và thêm nội dung của bạn vào đó. – mlt

Trả lời

82

PostgreSQL adapter schema_search_path trong database.yml không giải quyết được sự cố của bạn?

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

Hoặc, bạn có thể chỉ định các kết nối khác nhau cho mỗi schema:

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" 

Sau mỗi lần kết nối được xác định, tạo ra hai mô hình:

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 

Và, tất cả các mô hình của bạn được thừa hưởng từ lược đồ tương ứng:

class MyModelFromPublic < PublicSchema 
    set_table_name :my_table_name 
end 

class MyOtherModelFromDiscoGs < DiscoGsSchema 
    set_table_name :disco 
end 

Tôi hy vọng nó sẽ giúp.

+7

Có vẻ như bạn nên thêm self.abstract_class = true vào * Các lớp Schema để tránh các lỗi không tồn tại của bảng. –

8

Chỉ cần làm

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

phương pháp set_table_name đã được loại bỏ. self.table_name hoạt động tốt.

6

set_table_name đã bị xóa và được thay thế bằng self.table_name.

Tôi nghĩ bạn nên Mã theo như:

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

Trong cuộc di cư:

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 

Tùy chọn trong mô hình

class User < ActiveRecord::Base 
    self.table_name 'settings.users' 
end 
Các vấn đề liên quan