2009-05-21 18 views
1

Ich habe einen separaten DB für ein Modell in meiner Anwendung und in der Entwicklung Modus funktioniert die Verbindung ordnungsgemäß, in der Produktion ist es jedoch nicht.DB Verbindungsproblem in der Produktion

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

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

Das Modell, das auf die anderen Datenbank verbindet, wird Benutzer genannt, aber die Tabelle es in other_db verweist ist smf_users so mein User.rb wie sieht folgendermaßen aus:

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

In der Produktion Ich bin Erhalten dieses Fehlers:

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

Beachten Sie, wie es versucht, eine Verbindung mit der falschen Datenbank herzustellen und ist daher nicht Suche nach der richtigen Tabelle. Wie gesagt, das funktioniert im Entwicklungsmodus.

Irgendwelche Vorschläge?

+0

An welchem ​​Punkt wird der Fehler ausgelöst? Versuchen Sie etwas wie User.find() oder ist es durch eine Beziehung? – catalpa

Antwort

1

ich gefunden habe, wenn mehrere Datenbanken verwenden, die ungerade Fehler angezeigt, wenn Assoziationen zu tun. Gibt es eine Chance, dass Sie ein anderes Modell haben, das belongs_to :users und Sie erwarten, dass es nur funktioniert? Andernfalls müssen Sie Caching betrachten - es ist leicht möglich, dass Rails die Verbindungsdaten für Ihre zusätzliche Datenbank nicht korrekt zwischenspeichert.

+0

Ja, das könnte es sein. Fällt in diesem Fall der Befehl angites_to: user aus? – arfon

+0

Ich denke es würde, und das würde den Fehler erzeugen, den Sie sich erkundigen. Ich denke nicht, dass Sie in der Lage sein werden, die Verbindungen DSL über mehrere Datenbanken hinweg zu verwenden. Sie können Ihre eigene: users -Methode für das zugehörige Modell erstellen und darin sagen: User.all: conditions => ['associated_id =?', Id]. Eine andere Option könnte sein, Ihre Benutzertabelle mit Hilfe von after_save Callbacks in die andere Datenbank zu spiegeln. – austinfromboston

+0

Ja OK, fair genug. – arfon

0

Versuchen:

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

establish_connection braucht einen Hash-Wert der Verbindungsinformation. Dies sollte zurückgegeben werden, wenn von Datenbank.yml.

Vielleicht möchten Sie Ihre Log für eine Nachricht wie die folgende überprüfen:

„users_production Datenbank konfiguriert ist, nicht“

Diese Botschaft von Activerecord :: Base geworfen würde, wenn es nicht das finden Kongregation durch String in database.yml.

+0

Danke, aber ich bin zuversichtlich, dass es die Konfiguration findet, da ich diesen Fehler nicht sehe. Ich bin mir ziemlich sicher, dass etwas damit zu tun hat, dass ActiveRecord die Verbindung zwischenspeichert. – arfon

+0

haben Sie versucht, Konfigurationen ['users_production'] in einer Produktionskonsole auszuführen, um den Zugriff zu bestätigen? – catalpa

+0

Das ist sehr seltsam. Es funktioniert gut in der Konsole, wenn ich User.connection schreibe, aber beim Durchlaufen von Passener schlägt es falsch DB – arfon