web-dev-qa-db-fra.com

Connexion à plusieurs bases de données dans Ruby on rails

J'ai une Ruby on Rails application fonctionne bien et connectée à une base de données. Maintenant, je veux me connecter à une base de données différente à partir de la même application. Le modèle de données peut être exactement le même. En fait, si je me connecte à une base de données différente, l'application fonctionne correctement. Cependant, je veux me connecter à deux bases de données différentes. Est-il possible en Ruby on rails?

31
user1428970

Pour une connexion à plusieurs bases de données, vous devez ajouter les codes suivants au fichier database.yml. Ici, je donne l'exemple de la connexion de deux bases de données à partir d'une application Rails

config/database.yml

development:
  adapter: mysql2
  database: db1_dev
  username: root
  password: xyz
  Host: localhost

development_sec:
  adapter: mysql2
  database: db2_dev
  username: root
  password: xyz
  Host: localhost

production:
  adapter: mysql2
  database: db1_prod
  username: root
  password: xyz
  Host: your-production-ip

production_sec:
  adapter: mysql2
  database: db2_prod
  username: root
  password: xyz
  Host: your-production-ip

Ici, j'ai utilisé deux bases de données pour l'environnement de développement et de production.

Nous devons maintenant connecter le modèle aux bases de données. Lorsque vous exécutez votre application en mode développement et production, tous les modèles seront mappés via les paramètres de développement et de production db ceux mentionnés dans votre database.yml. Donc, pour certains modèles, nous devons nous connecter à une autre base de données.

Supposons que nous avons deux modèles Utilisateur et Catégorie. La table des utilisateurs se trouve dans db1_dev et db1_prod, la table des catégories dans db2_dev et db2_prod.

Modèle de catégorie

class Category < ActiveRecord::Base
  establish_connection "#{Rails.env}_sec"
end

De même, lorsque vous ajoutez la nouvelle migration pour la deuxième base de données, vous devez lui ajouter le code suivant.

class CreateRewards < ActiveRecord::Migration
  def connection
    ActiveRecord::Base.establish_connection("#{Rails.env}_sec").connection
  end

  def change
    # your code goes here.
  end
end

J'espère que cela fonctionnera pour vous :).

73
Bachan Smruty

Utilisation establish_connection pour passer à une autre base de données:

ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :Host     => "localhost",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)

Vous pouvez également passer un environnement préconfiguré à partir de database.yml comme ceci:

ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['other_env'])

Vous pouvez également le définir pour un modèle spécifique:

MyClass.establish_connection(...)
18
PinnyM