un modèle de connexion Dynamiquement aux bases de données dans une application en cours d'exécution?

StackOverflow https://stackoverflow.com/questions/966246

Question

J'ai lu plusieurs des questions existantes / fils à ce sujet, mais gardez à l'esprit que pas d'entre eux ont directement abordé ma question. Gardez à l'esprit que c'est PAS une situation pour database.yml que je ne veux pas connaître l'info DB à l'avance.

Cela dit, je besoin d'une solution pour DYNAMIQUEMENT se connecter à plusieurs bases de données dans une application Rails. Ma situation est que j'ai plusieurs sites d'enregistrement de données, toutes avec une table de données simples (événements, timestamp, VALEUR). Ces sites doivent (et) restent comme elles sont dues à des applications locales qui ont besoin de les utiliser.

Ce que je dois est de créer une application qui maintient une table de « MYSQL_LOGINS » et utilise chacun de ces connexions pour se connecter à l'une des différentes bases de données et fournir des graphiques / graphiques pour les données qui s'y trouvent.

Mon modèle « de données » restera le même pour toutes les bases de données MySQL auquel je connecter, je dois simplement être en mesure de dire mon modèle pour se connecter à un autre DB à la volée. J'espère que c'est étonnamment simple, mais nous verrons.

Était-ce utile?

La solution

Vous voulez ActiveRecord :: Base # establish_connection . Vous aurez probablement envie de l'utiliser dans une sous-classe abstraite de sorte que les modèles en utilisant les connexions manuelles ne perturbent pas la connexion utilise le reste de votre application:

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

class LogItem < LogBase
  ...
end

LogItem.establish_connection { ... }

LogItem.find_by_ ...

Si vous ne jamais avoir un modèle qui fait des connexions manuelles de la classe abstraite est inutile.

Connaissez-vous l'ensemble des bases de données que vous pouvez connecter à? Si oui, database.yml peut encore être utile pour vous. Vous pouvez mettre toutes les informations là-dedans comme un répertoire, donnant à chaque base de données un nom, puis a choisi de façon dynamique que l'on à establish_connection avec dans l'application en utilisant ces noms:

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

# foo.rb
LogItem.establish_connection :atlanta

Configuration des connexions peuvent être assez lourds, doublement si les sites sont séparés par un réseau étendu. Je pense que il est plus logique d'utiliser une approche extraction, la transformation et la charge utiliser une tâche cron horaire / jour pour copier les données sur un site de reporting centralisé. Ceci est la forme la plus élémentaire d'un entrepôt de données, et une approche très couramment utilisée. Si vous utilisez MySql, Maatkit Sync est un petit outil propre, comme rsync pour les tables. Alternativement, vous utilisez probablement une base de données qui prend en charge la réplication maître-esclave, mais cela peut être beaucoup plus compliqué à maintenir.

Autres conseils

Rails ne prend pas en charge plusieurs bases de données de la boîte encore (peut ne le sera jamais, qui sait). Vous devrez pirater la connexion en quelque sorte de base de données dans ActiveRecord pour ce modèle.

est la documentation d'enregistrement actif pour cela, et est ici la documentation spécifique vous devrez passer outre.

Ce est quelque chose qui explique très bien le processus.

Il y a aussi certains semi-prêt à la production noreferrer projets attaquer ce problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top