2009-08-04 4 views
41

Ich brauche verschiedene Datenbankverbindungen in verschiedenen Rails-Modellen. Gibt es eine nicht so hacky Art, das zu tun?Wie arbeite ich mit zwei verschiedenen Datenbanken in Rails mit aktiven Datensätzen?

würde Alle Links oder die Keywords groß sein :)

+0

Meinen Sie, dass verschiedene Felder in einem einzelnen Modell tatsächlich aus verschiedenen Datenbanken oder ju stammen dass verschiedene Modelle innerhalb der Anwendung aus verschiedenen Datenbanken stammen? – mikej

+0

verschiedene Modelle von verschiedenen Datenbankservern – gustavgans

+0

@gustavgans - Ich habe Ihre Frage bearbeitet, um sie etwas klarer zu machen, basierend auf Ihrer Antwort auf 'mikej'. –

Antwort

9

MikeJ Recht ist nicht in der Standard-Datenbank-Unterklasse ist. Ich habe jedoch einen Edelstein geschrieben, der den Modellcode etwas sauberer verbindet, check it out.

+0

Der obige Link ist kaputt. Hier ist der richtige: http://github.com/cherring/connection_ninja – abeger

+1

@railsninja Thanks.You wissen, wie Migrationen in zwei Datenbanken ausgeführt werden könnte. – maxiperez

112

hinzufügen neue Abschnitte zu Ihrem database.yml z.B.

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

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

eine Klasse in lib/other_database.rb

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

hinzufügen und dann für jedes Modell, das aus OtherDatabase z.B .:

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

Ich musste hinzufügen "self.abstract_class = true" in 'lib/other_database.rb' – ybart

12

Ich habe Folgendes verwendet, um mit 2 dB in der gleichen App zu verbinden. Ich lege sie in den lib-Ordner, da alles darin geladen ist.

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 

Hoffnung, die

+0

Ich musste Daten von einer alten App in eine neue App in einer Rake-Aufgabe migrieren und verwendete einen ähnlichen Ansatz. Der Unterschied bestand darin, dass die Rails-Task, da die Rake-Tasks ': task_name =>: environment' verwenden, die Rails-Umgebung zur Verfügung hat, sodass das Modell in der neuen App einfach als normal verwendet werden kann und von database.yml abgerufen wird. Nur das Modell für die alte App muss seine Informationen so definieren, wie Sie es anzeigen. –

9

Update für Rails 3.x hilft:

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

In Schienen 4.1+ establish_connection nimmt jetzt ein Symbol:

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

denke ich, dass das hübscheste Möglichkeit, eine Verbindung zu einer anderen Datenbank mit aktivem Modell herzustellen, erstellt eine Basisklasse für eine externe Datenbank und erbt dann daraus Basis in Ihrem Modell. Diese Methode funktioniert gut mit Schienen 4.2.6 und 5.0.4

Zum Beispiel:

# 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 

Und in der Modellklasse:

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

Aber Sie externe Datenbank in/config definieren müssen /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 
Verwandte Themen