web-dev-qa-db-fra.com

Comment travailler avec deux bases de données différentes dans Rails avec des enregistrements actifs?

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 :)

42
gustavgans

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 .

9
nitecoder

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
114
mikej

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 

12
penger

Mise à jour pour Rails 3.x:

class MyModel < ActiveRecord::Base
  establish_connection "other_#{Rails.env}"
end
9
penkovsky

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
1
Adi

Dans Rails 4.1+, establish_connection prend maintenant un symbole:

class OtherDbModel < ActiveRecord::Base
  establish_connection :"other_#{Rails.env}"
end
0
Vasfed