Je dois utiliser différentes connexions de base de données dans différents modèles Rails. Y a-t-il un moyen pas si malin de faire ça?
N'importe quel lien ou mot clé de recherche serait génial :)
mikej a raison. Cependant, j’ai écrit un petit bijou qui rend le code de modèle à connecter un peu plus propre, jette un œil .
Ajoutez de nouvelles sections à votre database.yml
p. Ex.
other_development:
adapter: mysql
database: otherdb_development
username: root
password:
Host: localhost
other_production:
adapter: mysql
database: otherdb_production
username: root
password:
Host: localhost
Ajouter une classe dans lib/other_database.rb
class OtherDatabase < ActiveRecord::Base
establish_connection "other_#{Rails_ENV}"
end
puis pour chaque modèle qui ne figure pas dans la sous-classe de base de données par défaut de OtherDatabase
exemple:
class MyModel < OtherDatabase
# my model code...
end
J'ai utilisé ce qui suit pour me connecter à 2 db dans la même application. Je les mets dans le dossier lib car tout y est chargé.
require 'active_record'
class OldDatabase < ActiveRecord::Base
self.abstract_class = true
establish_connection(
:adapter => 'mysql',
:database => 'weather',
:Host => 'localhost',
:username => 'root',
:password => 'password'
)
end
class NewDatabase < ActiveRecord::Base
self.abstract_class = true
establish_connection(
:adapter => 'mysql',
:database => 'redmine',
:Host => 'localhost',
:username => 'root',
:password => 'password'
)
end
class WeatherData < OldDatabase
end
class Board < NewDatabase
end
J'espère que cela pourra aider
Mise à jour pour Rails 3.x:
class MyModel < ActiveRecord::Base
establish_connection "other_#{Rails.env}"
end
Je pense que la meilleure façon de se connecter à une autre base de données avec un modèle actif consiste à créer une classe de base pour une base de données externe, puis à hériter de cette base dans votre modèle. Cette méthode fonctionne bien avec Rails 4.2.6 et 5.0.4.
Par exemple:
# in /models/external_db/base.rb
require 'active_record'
class ExternalDb::Base < ActiveRecord::Base
self.abstract_class = true
establish_connection "external_db_#{Rails.env}".to_sym
end
Et dans votre classe de modèle:
# in /models/external_db/some_model.rb
class ExternalDB::SomeModel < ExternalDb::Base
# your code
end
Mais vous devez définir une base de données externe dans /config/database.yml
# in /config/database.yml
external_db_development:
adapter: sqlite3
pool: 5
timeout: 5000
database: db/external_db_development.db
external_db_production:
adapter: sqlite3
pool: 5
timeout: 5000
database: db/external_db_production.db
Dans Rails 4.1+, establish_connection
prend maintenant un symbole:
class OtherDbModel < ActiveRecord::Base
establish_connection :"other_#{Rails.env}"
end