51

Tengo una base de datos PostgreSQL para mi aplicación Rails. En el esquema llamado 'public' se almacenan las tablas principales de los modelos de Rails. He creado un esquema 'discogs' que tendrá tablas con nombres que a veces son los mismos que en el esquema 'público', que es una de las razones por las que Estoy usando esquemas para organizar esto.Uso de esquemas PostgreSQL múltiples con modelos Rails

¿Cómo configuraría los modelos del esquema 'discogs' en mi aplicación? Utilizaré Sunspot para dejar que Solr indexe estos modelos también. No estoy seguro de cómo harías esto.

+2

¿Cómo se crea el esquema no 'público' cuando se configura la base de datos a través de la tarea db: create rake? Agregar el esquema a la base de datos template1 es una posibilidad. Pero, ¿hay alguna manera de hacerlo como parte del proceso normal de desarrollo de raíles/rake? – TsenYing

+0

@TsenYing [Hay una joya de pg_power] (http://stackoverflow.com/a/18227887/673826) para eso como una opción. Su [inicio está aquí] (https://github.com/TMXCredit/pg_power). No ha sido actualizado por 2 años sin embargo. Otra opción podría ser escribir * create * rake task en * db * namespace y agregar sus cosas ahí. – mlt

Respuesta

82

El adaptador PostgreSQL schema_search_path en database.yml no resuelve su problema?

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

O bien, puede especificar diferentes conexiones para cada esquema:

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" 

Después de cada conexión definida, cree dos modelos:

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 

Y, todos sus modelos heredan de la esquema respectivo:

class MyModelFromPublic < PublicSchema 
    set_table_name :my_table_name 
end 

class MyOtherModelFromDiscoGs < DiscoGsSchema 
    set_table_name :disco 
end 

Espero que ayude.

+7

Parece que debe agregar self.abstract_class = true a * Clases de esquema para evitar problemas de tablas no existentes. –

8

Eso sí,

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

método set_table_name de haber quitado. self.table_name funciona bien.

6

Porque set_table_name se eliminó y se reemplazó por self.table_name.

Creo que deberías código de seguimiento como:

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

En migraciones:

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 

Opcional en el modelo

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