¿Cómo trabajo con dos bases de datos diferentes en Rails con registros activos?

Necesito usar diferentes conexiones de base de datos en diferentes modelos de Rails. ¿Hay una manera no tan hacky de hacer eso?

Cualquier enlace o palabras clave de búsqueda sería genial 🙂

mikej tiene razón Sin embargo, escribí una joya que hace que el código del modelo se conecte un poco más limpio, compruébalo .

Agregue nuevas secciones a su database.yml eg

 other_development: adapter: mysql database: otherdb_development username: root password: host: localhost other_production: adapter: mysql database: otherdb_production username: root password: host: localhost 

Agregue una clase en lib/other_database.rb

 class OtherDatabase < ActiveRecord::Base establish_connection "other_#{RAILS_ENV}" end 

y luego para cada modelo que no está en la subclase de base de datos predeterminada de OtherDatabase por ejemplo:

 class MyModel < OtherDatabase # my model code... end 

He estado utilizando lo siguiente para conectarme a 2 db en la misma aplicación. Los puse en la carpeta lib ya que todo está cargado.

 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 

Espero que ayude

Actualización para Rails 3.x:

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

Creo que la manera más bonita de conectarse a otra base de datos con el modelo activo es crear una clase base para la base de datos externa y luego heredar de esa base en su modelo. Este método funciona bien con los carriles 4.2.6 y 5.0.4

Por ejemplo:

 # 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 

Y en tu clase de modelo:

 # in /models/external_db/some_model.rb class ExternalDB::SomeModel < ExternalDb::Base # your code end 

Pero debe definir una base de datos externa en /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 

En rails 4.1+ establish_connection ahora toma un símbolo:

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