2010-04-07 8 views
2

Pour des raisons héritées, les tables de mon modèle sont stockées dans deux bases de données différentes sur le même serveur MySQL. Au début, je viens d'utiliser establish_connection pour spécifier la deuxième base de données sur les modèles qui l'ont utilisé. Cependant, quand j'ai établi une connexion has_many :through entre deux modèles dans différentes bases de données, il a explosé parce que MySQL ne peut pas JOIN sur deux serveurs différents. Ensuite, j'ai remarqué sur les interwebs que je pouvais utiliser set_table_name 'other_database.foos' au lieu d'utiliser establish_connection.Rails: utilisation de set_table_name pour joindre des bases de données différentes sur le même serveur mysql

Cela fonctionne principalement, mais table_exists? renvoie toujours false même lorsque la table existe, et quelques-uns des plugins que j'utilise utilisent largement cette fonction.

Est-ce un bug dans table_exists?, ou est-ce que j'utilise mal set_table_name? Y a-t-il une autre façon de faire ce que j'essaie de faire?

+0

Je vous remercie pour cette question, cela m'a aidé à résoudre le problème qui était à l'origine de mes cheveux. – zrl3dx

Répondre

1

table_exists? effectue les opérations suivantes:

def table_exists?(table_name) 
    tables.include?(table_name.to_s) 
end 

Lorsque tableaux est un tableau des noms de table pour la connexion établie (définie dans databases.yml). Donc, si vous appelez table_exists?('database.table_name') ou table_exists?('table_name_from_second_database') alors il retournera toujours faux. La seule façon de contourner ce problème serait de corriger le singe table_exists? ou la fonction qui charge le tableau tables. Voir le api docs pour voir par où commencer le patch.

Bonne chance!

Questions connexes