2013-08-09 5 views
5

In einigen meiner Rails-Anwendungen scheinen meine ActiveRecord-Modelle bei der Initialisierung db-Verbindungen herzustellen (z. B. wenn ich rails console mache), während in anderen Verbindungen anscheinend nur eingerichtet wird, wenn ich die Modellklasse referenziere oder ein Modellobjekt instanziiere.Wann stellt ActiveRecord Verbindungen her?

Zum Beispiel ging ich einfach zu einer Anwendung geöffnet Rails-Konsole und schrieb:

SomeModel.connected? 

und es kehrte false. Ich ging zu einer anderen Anwendung, gab denselben Befehl (für ein anderes Modell) ein und gab true zurück. Ich ging zu einer dritten Anwendung und gab den gleichen Befehl ein. Diesmal wartete es einen Moment und kehrte dann true zurück, was mich denken ließ, dass die connected? Methode die Verbindung aus irgendeinem Grund ausgelöst hat.

Dieser Unterschied im Verhalten scheint nicht mit Rails-Versionen oder den Inhalten der Modelle verwandt zu sein. Es könnte etwas Seltsames sein, das ich in meinen Initialisierern gemacht habe, aber das glaube ich nicht.

Wann stellt Rails Verbindungen her? Oder wie ist das erwartete Verhalten?

ZUSÄTZLICHE INFORMATIONEN

ich will hinzufügen, dass es nicht wie connected? kehrt scheint falsch, weil Rails nicht mit der Datenbank verbinden.

Zum Beispiel in meinem ersten Anwendung habe ich:

SomeModel.connected? 
# => false 
SomeModel.table_exists? # or any other command that makes Rails look at db 
# => true 
SomeModel.connected? 
# => true 

Antwort

4

meine eigene Frage zu beantworten:

Ob eine Datenbankverbindung tatsächlich während des Rails Initialisierungsprozess initialisiert wird, hängt im Wesentlichen ab, ob ActiveRecord::Base.connection (nicht establish_connection) während der Initialisierung aufgerufen wird.

Dies kann mit der Rails-Version zu tun haben: z. B. in Rails 3.2.13 ist der "active_record.validate_explain_support "initializer macht ein Aufruf an connection:

!ActiveRecord::Base.connection.supports_explain? 

In Rails 3.2.14 wird dieser Aufruf nicht gemacht

jedoch Schienen 3.2.14 kann einen Aufruf an connection in den machen." active_record.set_reloader_hooks "initializer. Dieser Aufruf kann mit dem Befehl auftreten

ActiveRecord::Base.clear_cache! 

obwohl die prepare Rückruf Läufer nicht immer scheint dies zu nennen ...

Ich fand auch, dass einige Edelsteine ​​(z. B. ActiveAdmin) einen Initialisierungsprozess haben, der an einem bestimmten Punkt connection aufrufen wird.

+1

Möglicherweise verbundene Zusagen https://github.com/rails/rails/commit/7423a71fc02c0ca3bf37b94e16a1322c0caaa6fd, https://github.com/rails/rails/commit/85cc7122bab1cfec661fdfe3bf4738d9fba55399. Leider wird letzterer nicht auf 3.2.x – sayap

+1

zurückportiert. Und das gilt auch: https://github.com/rails/rails/commit/d3688e02ca52c0b72d3092e8498da51e06b7fc58 – sayap

+0

@sayap, hey danke für die Links. Die helfen wirklich, das beabsichtigte/erwartete Verhalten zu erklären –

0

Ich kann Ihnen exakte Lösungen nicht bieten, weil es mehrere Gründe geben könnte, warum einige Diskrepanzen gibt.

Angenommen, Sie haben die Methode connected? nicht umgeschrieben, wird True zurückgegeben, wenn ein Rails-Modell eine Verbindung zu seinem Back-End herstellen kann. Beachten Sie, dass es sich beim Backend um eine lokale Datenbank in Ihrem Computer, eine entfernte Datenbank in Ihrem VPN bei Ihrer Arbeit oder eine weit entfernte entfernte Datenbank von Amazon RDS handeln kann. Je nach Rails-Umgebung, Datenbankkonfiguration und Rails-App kann dies abweichen. Die Zeit bis zur Überprüfung der Verbindung kann von Fall zu Fall unterschiedlich sein.

Es gibt false zurück, wenn keine Verbindung zu seinem Backend hergestellt werden kann. Dies könnte wiederum auf viele Gründe zurückzuführen sein. Ihre Datenbankkonfiguration ist möglicherweise falsch. Ihre entfernte Datenbank ist möglicherweise nicht verfügbar. Es könnte auch vom Design erwartet werden. Wenn Sie beispielsweise ein Modell verwenden, das activemodel verwendet, aber json für die Kommunikation mit einer API statt einer konventionellen Datenbank verwendet, gibt es false zurück, da die Modelltabelle nicht in der Datenbank enthalten ist.

Ich hoffe, das hilft.

+0

Danke für die Antwort. In diesem Fall handelt es sich nicht um ein Datenbankverbindungsproblem - siehe oben meine zusätzlichen Informationen. Ich habe 'connected?' Oder andere 'ActiveRecord' Methoden nicht umgeschrieben. –

+0

Passt Ihr schema.rb exakt zu Ihrer Datenbank? –

+0

Ja (ich verwende nur SQLite). –

Verwandte Themen