80 votes

Utilisation de plusieurs schémas PostgreSQL avec des modèles Rails

J'ai une base de données PostgreSQL pour mon application Rails. Dans le schéma nommé 'public', les tables principales des modèles Rails sont stockées, etc. J'ai créé un schéma 'discogs' qui aura des tables avec des noms parfois les mêmes que dans le schéma 'public' - ce qui est l'une des raisons pour lesquelles J'utilise des schémas pour organiser cela.

Comment configurer des modèles à partir du schéma « discogs » dans mon application ? J'utiliserai Sunspot pour permettre à Solr d'indexer également ces modèles. Je ne sais pas comment vous feriez cela.

124voto

Felsangom Points 1382

L'adaptateur PostgreSQL schema_search_path dans database.yml résout-il votre problème ?

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

Ou, vous pouvez spécifier différentes connexions pour chaque schéma :

 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"

Après chaque connexion définie, créez deux modèles :

 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

Et, tous vos modèles héritent du schéma respectif :

 class MyModelFromPublic < PublicSchema
  set_table_name :my_table_name
end

class MyOtherModelFromDiscoGs < DiscoGsSchema
  set_table_name :disco
end

J'espère que ça aide.

21voto

Lalu Points 27

La bonne pour les rails 4.2 est la suivante :

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

Plus d'informations - http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-table_name-3D

16voto

Jaime Castrillon Points 111

Dans les migrations :

 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

En option dans le modèle

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

13voto

maniek Points 3215

Fais juste

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

12voto

Khanh Pham Points 1650

Parce que set_table_name été supprimé et remplacé par self.table_name .

Je pense que vous devriez coder comme suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X