2009-05-21 8 views
1

J'ai un DB distinct pour un modèle dans mon application et en mode de développement la connexion fonctionne correctement, en production cependant elle ne l'est pas.Problème de connexion DB en production

production: 
    adapter: mysql 
    host: myhost 
    username: root 
    password: 
    database: production_db 

users_production: 
    adapter: mysql 
    host: myhost 
    username: root 
    password: 
    database: other_db 

Le modèle qui se connecte à l'autre base de données est appelée utilisateur, mais la table il fait référence à other_db est smf_users donc mon User.rb ressemble ceci:

class User < ActiveRecord::Base 
    establish_connection "users_#{RAILS_ENV}" 
    set_table_name "smf_users" 
end 

En production, je suis obtenir cette erreur:

Mysql::Error: Table 'production_db. smf_users' doesn't exist: 

Notez comment il tente de se connecter à la base de données mal et est donc pas trouver la bonne table. Comme je le dis, cela fonctionne en mode développement.

Des suggestions?

+0

À quel moment l'erreur s'est-elle produite? Essayez-vous quelque chose comme User.find() ou est-ce à travers une relation? – catalpa

Répondre

1

que j'ai trouvé lors de l'utilisation de bases de données multiples que les erreurs étranges apparaissent lorsque vous faites des associations. Y a-t-il une chance que vous ayez un autre modèle là-bas et que vous vous attendiez à ce qu'il fonctionne? Sinon, vous devez regarder la mise en cache - il est très possible que Rails ne cache pas correctement les données de connexion pour votre base de données supplémentaire.

+0

Oui, ça pourrait être ça. L'utilisateur belongs_to: va-t-il échouer dans ce cas? – arfon

+0

Je pense que ce serait, et cela produirait l'erreur que vous vous posez. Je ne pense pas que vous serez en mesure d'utiliser les associations DSL à travers plusieurs bases de données. Vous pouvez créer votre propre méthode: users sur le modèle associé, et indiquer: User.all: conditions => ['associated_id =?', Id]. Une autre option pourrait être de mettre en miroir votre table utilisateur dans l'autre base de données en utilisant les callbacks after_save. – austinfromboston

+0

Oui, ça va. – arfon

0

Essayez:

establish_connection configurations[RAILS_ENV]["users_#{RAILS_ENV}"] 
User.connection 

establish_connection a besoin d'un hachage des informations de connexion. Cela devrait retourner si de database.yml.

Vous pouvez vérifier votre journal pour un message comme le suivant:

« base de données de users_production n'est pas configuré »

Ce message serait jeté par ActiveRecord :: Base si elle ne trouve pas le congestion par chaîne dans database.yml.

+0

Merci, mais je suis confiant que c'est trouver la config car je ne vois pas cette erreur. Je suis sûr que cela a quelque chose à voir avec ActiveRecord en cache la connexion. – arfon

+0

avez-vous essayé d'exécuter des configurations ['users_production'] dans une console de production pour confirmer qu'elle est accessible? – catalpa

+0

C'est très étrange. Cela fonctionne bien dans la console si je tape User.connection mais lors de l'exécution de Passenger il frappe le mauvais DB – arfon

Questions connexes