web-dev-qa-db-fra.com

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

J'ai une base de données PostgreSQL pour mon Rails. Dans le schéma nommé 'public', les principales tables de modèles Rails sont stockées, etc. J'ai créé un 'discogs 'schéma qui aura des tables avec des noms qui sont parfois les mêmes que dans le schéma' public '- c'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 laisser Solr indexer également ces modèles. Je ne sais pas comment tu ferais ça.

64
Johan

L'adaptateur PostgreSQL schema_search_path dans database.yml résout 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 des connexions différentes 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.

101
Felsangom

Le bon pour Rails 4.2 est comme:

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

12
Lalu

Fais juste

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

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
9

Car set_table_name a é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
8
Khanh Pham

méthode set_table_name a été supprimé. self.table_name fonctionne très bien.

1
zhulinpinyu