2011-05-15 4 views
0

permet de dire que j'ai des utilisateurs, et que chaque utilisateur appartient à un groupe. Pour des raisons de sécurité, je veux avoir une base de données séparée pour chaque groupe. J'imagine que les objets Utilisateur et Groupe sont stockés dans une base de données centrale, et l'authentification est effectuée sur cette base de données, mais tous les autres objets se connectent dynamiquement à différentes bases de données définies dans l'objet Groupe.connecter l'application rails à de nombreuses bases de données

Donc la question est: comment me connecter dynamiquement à différentes bases de données avec mon objet en fonction de certains paramètres (par exemple dbname)?

Répondre

1

Vous pouvez utiliser la méthode de classe "establish_connection", mais pour être honnête, je ne sais pas si cela peut être appelé dynamiquement chaque fois que vous en avez besoin. Je l'utilise pour les modèles qui se connecte à la base de données différente de cette façon:

class SomeModel < ActiveRecord::Base 
    establish_connection "second_#{Rails.env}" 
end 

database.yml:

development: 
    adapter: mysql2 
    username: web 
    password: 
    database: first_db 
    pool: 5 

second_development: 
    ... 
    database: second_db 
    pool: 5 

Pour autant que je sache, établir la connexion peut également être appelé à droite avec Hash contenant les parameteres de database.yml, par exemple

establish_connection { :username => "web", :database => "..." } 

Mais je ne sais pas si cela va utiliser le regroupement de connexions si vous le faites de cette façon. Je l'utilise aussi comme ça quand j'écris un script en dehors des rails (juste du rubis pur avec inclusion de l'activeecord) puis je me connecte à db manuellement.

J'espère que cette aide. J'ai créé pour rendre cela facile

Cordialement, de NoICE

+0

Merci. Je vais confirmer comment cela fonctionne dès que possible. – Mateusz

0

utilisation de pierres précieuses MultiConfig.

Vous pouvez spécifier les configs dans un fichier séparé comme second.yml etc, puis appelez:

ActiveRecord::Base.config_file = 'second' # for all models

ou

SomeModel < ActiveRecord::Base 
    self.config_file = 'second' 
end 

De cette façon, il sera beaucoup plus facile à entretenir et plus propre à la recherche .

+0

Puis-je lui faire prendre des données pour différents ID de base de données différente? Je veux dire, est-ce que je peux avoir des parties de données du même modèle dans des bases de données différentes? Dites, si ID <1000 le prennent de la base de données A, et si ID> = 1000 le prennent de la base de données B? – Mateusz

+0

Pas encore .. c'est juste des données complètes de 1 db .. ce que vous pouvez faire est de changer dynamiquement db. .Model.config_file = 'xxx' .. puis trouver .. puis Model.config_file = 'base de données' – ShadyKiller

Questions connexes