Connexion de Rails 3.1 à plusieurs bases de données

Chez ShowNearby, nous avons effectué une très grande migration vers RoR 3.1 depuis PHP et nous sums confrontés à plusieurs problèmes que certains d’entre vous ont peut-être déjà résolus.

Nous avons de grandes quantités de données et nous avons décidé de séparer notre firebase database en plusieurs bases de données que nous pouvons gérer séparément. Par exemple, nos comptes, lieux, journaux et autres sont divisés en plusieurs bases de données.

Nous devons avoir des migrations, des assemblys, des modèles, pour bien jouer, et jusqu’à présent, c’est assez désordonné. Certaines de nos exigences pour qu’une solution soit acceptable:

  • un modèle doit se rapporter à une table dans l’une des bases de données.
  • rake db: drop – devrait laisser tomber toutes les bases de données env que nous spécifions dans database.yml
  • rake db: create – devrait créer toute la firebase database env que nous spécifions dans database.yml
  • rake db: migrer – devrait exécuter des migrations vers les différentes bases de données
  • rake db: test – devrait saisir les appareils et les déposer dans les différentes bases de données et l’unité de test / fonction / etc

Nous envisageons de définir des projets de rails séparés pour chaque firebase database et de les connecter à ActiveResource, mais nous pensons que ce n’est pas très efficace. Certains d’entre vous ont-ils déjà rencontré un problème similaire?

Merci beaucoup!!

À la réponse de Wukerplank, vous pouvez également mettre les détails de la connexion dans database.yml comme d’habitude avec un nom comme celui-ci:

log_database_production: adapter: mysql host: other_host username: logmein password: supersecret database: logs 

Puis dans votre modèle spécial:

 class AccessLog < ActiveRecord::Base establish_connection "log_database_#{Rails.env}".to_sym end 

Pour garder ces informations d'identification embêtantes dans votre code d'application.

Edit: Si vous souhaitez réutiliser cette connexion dans plusieurs modèles, vous devez créer une nouvelle classe abstraite et en hériter, car les connexions sont étroitement liées aux classes (comme expliqué ici , ici et ici ), et de nouvelles connexions seront créées pour chaque classe.

Si tel est le cas, mettez les choses en place comme suit:

 class LogDatabase < ActiveRecord::Base self.abstract_class = true establish_connection "log_database_#{Rails.env}".to_sym end class AccessLog < LogDatabase end class CheckoutLog < LogDatabase end 

La connexion à différentes bases de données est assez simple:

 # model in the "default" database from database.yml class Person < ActiveRecord::Base # ... your stuff here end # model in a different database class Place < ActiveRecord::Base establish_connection ( :adapter => "mysql", :host => "other_host", :username => "username", :password => "password", :database => "other_db" ) end 

Je me méfierais de la mise en place de plusieurs projets Rails car vous appendiez beaucoup de frais généraux à la récupération de données pour vos contrôleurs, ce qui pourrait ralentir les choses.

En ce qui concerne vos questions sur les migrations, les agencements, les modèles, etc.: Je ne pense pas qu’il y aura un moyen facile, alors n’hésitez pas à poster des questions séparées et soyez aussi précis que possible.

La consolidation des bases de données en une seule n’est pas une option? Cela vous faciliterait la vie!

Vous avez trouvé un excellent article qui vous indiquera la bonne façon de faire cette vérification http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html

Configurez-le comme ceci:

database.yml (fichier de configuration de firebase database)

 support_development: adapter: blah database: blah username: blah password: blah 

support_base.rb (un fichier modèle)

 class SupportBase < ActiveRecord::Base self.abstract_class = true #important! establish_connection("support_development") end 

tst_test.rb (un fichier modèle)

 class TstTest < SupportBase #SupportBase not ActiveRecord is important! self.table_name = 'tst_test' def self.get_test_name(id) if id = nil return '' else query = "select tst_name from tst_test where tst_id = \'#{id}\'" tst = connection.select_all(query) #select_all is important! return tst[0].fetch('tst_name') end end end 

PS, cela ne couvre pas vraiment les migrations, je ne pense pas que vous puissiez faire des migrations sur plus d'une firebase database avec rake (même si je ne suis pas certain que ce soit difficile à faire, c'est possible). C'était juste un excellent moyen de connecter et d'interroger d'autres bases de données que vous ne contrôliez pas.

Vous pouvez également append l’environnement Rails afin que vos bases de développement et de test ne soient pas identiques.

 establish_connection "legacy_#{Rails.env}" 

L’ article suivant suggère de définir de nouvelles tâches Rake pour réaliser des migrations sur plusieurs bases de données. Chaque tâche configure sa propre connexion, puis exécute la migration avec cette connexion et le dossier de firebase database spécifique.

Il définit également une db:migrate familière db:migrate qui appelle les deux autres tâches.

En incluant ici le lien devient indisponible:

 desc "Migrate the database through scripts in db/migrate directory." namespace :db do task :migrate do Rake::Task["db:migrate_db1"].invoke Rake::Task["db:migrate_db2"].invoke end task :migrate_db1 do ActiveRecord::Base.establish_connection DB1_CONF ActiveRecord::Migrator.migrate("db/migrate/db1/") end task :migrate_db2 do ActiveRecord::Base.establish_connection DB2_CONF ActiveRecord::Migrator.migrate("db/migrate/db2/") end end 

Source: Ruby on Rails se connecte à plusieurs bases de données et migrations

Hey ce post est ancien mais j’ai trouvé une solution fonctionnant sur Rails 3.2 qui pourrait aider quelqu’un d’autre. https://stackoverflow.com/a/16542724/1447654