Frage

Ich habe viele der vorhandenen Fragen/Themen zu diesem Thema gelesen, aber denken Sie daran, dass keiner von ihnen haben mein Problem direkt angesprochen. Denken Sie auch daran, dass dies ist NICHT Eine Situation für Database.yml, da ich die DB -Informationen im Voraus nicht kenne.

Trotzdem brauche ich eine Lösung für Dynamisch Verbindung zu mehreren Datenbanken in einer Rails -App herstellen. Meine Situation ist, dass ich mehrere Datenprotokollierungsseiten mit einer einfachen Datentabelle (Ereignisse, Zeitstempel, Wert) habe. Diese Websites müssen (und werden) bleiben, da sie auf lokale Anwendungen zurückzuführen sind, die sie verwenden müssen.

Ich muss eine Anwendung erstellen, die eine Tabelle von "MySQL_logins" verwaltet und jedes dieser Anmeldungen verwendet, um eine Verbindung zu verschiedenen Datenbanken herzustellen und Diagramme/Diagramme für die darin enthaltenen Daten bereitzustellen.

Mein "Daten" -Modell bleibt für alle MySQL -Datenbanken, mit denen ich eine Verbindung herrsche, gleich. Ich muss lediglich in der Lage sein, mein Modell zu einer Verbindung zu einem anderen DB im laufenden Fliegen anweisen. Ich hoffe, das ist erstaunlich einfach, aber wir werden sehen.

War es hilfreich?

Lösung

Sie wollen ActivereCord :: Basis#deton_connection. Sie möchten es wahrscheinlich in einer abstrakten Unterklasse verwenden, so dass Modelle, die die manuellen Verbindungen verwenden, die Verbindung nicht stören, die der Rest Ihrer Anwendung verwendet wird:

class LogBase < ActiveRecord::Base
  self.abstract_class = true
end

class LogItem < LogBase
  ...
end

LogItem.establish_connection { ... }

LogItem.find_by_ ...

Wenn Sie immer nur ein Modell haben, das manuelle Verbindungen herstellt, ist die abstrakte Klasse unnötig.

Kennen Sie die vollständigen Datenbanken, mit denen Sie eine Verbindung herstellen könnten? In diesem Fall kann database.yml für Sie immer noch nützlich sein. Sie können alle Informationen dort als Verzeichnis einfügen und jeder Datenbank einen Namen geben und dann dynamisch ausgewählt werden, mit welchen Sie in der Anwendung mit diesen Namen festgelegt werden sollen:

# database.yml
atlanta:
  host: atlantadb.foo.com

# foo.rb
LogItem.establish_connection :atlanta

Das Einrichten von Verbindungen kann ziemlich heftig sein, doppelt so hoch, dass die Standorte durch das Wide Area -Netzwerk getrennt sind. Ich würde überlegen, ob es sinnvoller ist, einen Extrakt-Transform-Load-Ansatz zu verwenden und einen stündlichen/täglichen Cron-Job zu verwenden, um die Daten auf eine zentrale Berichtsseite zu kopieren. Dies ist die grundlegendste Form eines Data Warehouse und ein sehr häufig verwendeter Ansatz. Wenn Sie MySQL verwenden, Maatkit Sync ist ein ordentliches kleines Werkzeug, wie RSYNC für Tische. Alternativ verwenden Sie wahrscheinlich eine Datenbank, die die Master-Slave-Replikation unterstützt. Dies kann jedoch erheblich komplizierter sein.

Andere Tipps

Rails unterstützt noch nicht mehrere Datenbanken außerhalb des Boxs (vielleicht wird es nie tun, wer weiß). Sie müssen die Datenbankverbindung in ActiveCord für dieses Modell irgendwie entführen.

Hier ist die aktive Datensatzdokumentation dafür, und hier ist die Spezifische Dokumentation Sie müssen überschreiben.

Dies ist etwas, das den Prozess wirklich gut erklärt.

Es gibt auch etwas Halbproduktionsbereit Projekte dieses Problem angreifen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top