2010-01-24 4 views
2

J'écris une version plus simple de phpMyAdmin dans Rails; cette application Web sera exécutée sur un serveur Web (où les utilisateurs pourront indiquer le nom de la base de données, le nom d'hôte, le nom d'utilisateur, le mot de passe et le numéro de port de l'un des serveurs de base de données sur le même réseau). L'utilisateur sera alors connecté à cette machine et pourra utiliser l'interface utilisateur pour administrer cette base de données (ajouter ou supprimer des colonnes, supprimer des tables, etc.).Plusieurs connexions de base de données dans Rails

J'ai deux questions connexes (votre aide me aidera grandement à comprendre comment aborder au mieux cette):

  1. Dans une application Rails traditionnelle je stocker les informations de base de données dans database.yml, mais ici J'ai besoin de le faire dynamiquement. Existe-t-il un bon moyen de laisser le fichier database.yml vide et de dire à Rails d'utiliser les données de connexion fournies par l'utilisateur lors de l'exécution à la place?

  2. Différents utilisateurs peuvent se connecter à différentes bases de données (ou même à des hôtes). Je suppose que j'ai besoin de garder une trace de l'association entre une connexion de base de données établie et une session d'utilisateur. Quel est le meilleur moyen d'y parvenir?

Merci d'avance.

Répondre

2
  1. Pour éviter Rails de l'initialisation ActiveRecord à l'aide database.yml, vous pouvez simplement supprimer :active_record de config.frameworks dans config/environment.rb. Ensuite, pour établir manuellement des connexions, vous utilisez ActiveRecord::Base.establish_connection. (Et peut-être ActiveRecord::Base.configurations)

    ActiveRecord stocke toutes les connexions liées aux variables de classe. Donc, si vous voulez créer dynamiquement plusieurs connexions, vous devez également sous-classer dynamiquement ActiveRecord :: Base et appeler la fonction establish_connection.

    Ce sera votre classe de base abstraite pour toute sous-classe que vous utiliserez pour gérer les tables. Pour rendre ActiveRecord conscient de cela, vous devriez faire self.abstract_class = true dans la définition de la classe de base. Puis, chaque table que vous voulez gérer va à son tour dynamiquement sous-classer cette nouvelle classe de base abstraite.

  2. Ceci est plus difficile, car vous ne pouvez pas vraiment maintenir les connexions, bien sûr. La solution immédiate que je peux penser est de stocker un jeton unique dans la session, et l'utiliser dans un before_filter pour revenir à la sous-classe dynamique ActiveRecord :: Base, que vous allez probablement stocker dans un hachage quelque part.

    Cela devient plus intéressant une fois que vous commencez à courir plusieurs processus de travail Rails:

    • Vous devrez stocker toutes les informations de connexion de base de données dans la session, afin que les autres travailleurs peuvent l'utiliser.
    • Vous souhaitez probablement un jeton unique cohérent sur tous les travailleurs, utilisez donc une fonction de hachage sur une combinaison de paramètres de connexion à la base de données. Comme un worker peut être appelé avec un token qu'il ne connait pas encore, votre logique de sous-classement et de connection_connection arrivera probablement dans le before_filter. (Plutôt que le moment de la connexion, par exemple.)
    • Vous devrez trouver un moyen astucieux de collecte des ordures et des classes de collecte, lorsque l'utilisateur ne se déconnecte pas correctement et la session expire. (Désolé, je ne connais pas celui-ci.)
Questions connexes