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.
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.
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
Fais juste
class Foo < ActiveRecord::Base
set_table_name 'myschema.foo'
end
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
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
méthode set_table_name
a été supprimé. self.table_name
fonctionne très bien.