7

一部の Rails アプリケーションでは、ActiveRecord モデルは初期化時に db 接続を確立するように見えますが (たとえば、私が実行した場合rails console)、他のアプリケーションでは、モデル クラスを参照するか、モデル オブジェクトをインスタンス化するときにのみ接続が確立されるようです。

たとえば、私は 1 つのアプリケーションに移動し、Rails コンソールを開いて次のように書きました。

SomeModel.connected?

そして戻ってきfalseました。別のアプリケーションに移動し、(別のモデルに対して) 同じコマンドを入力すると、true. 3 番目のアプリケーションに移動し、同じコマンドを入力しました。今回は、ちょっと待ってから戻ってきたので、何らかの理由でメソッドが接続をトリガーしたtrueと思いました。connected?

この動作の違いは、Rails のバージョンやモデルの内容とは関係ないようです。イニシャライザで行った奇妙なことかもしれませんが、そうは思いません。

では、Rails はいつ接続を確立するのでしょうか? または、期待される動作は何ですか?

追加情報

connected?Railsがデータベースに接続できないため、falseを返すようには見えないことを付け加えておきます。

たとえば、最初のアプリケーションでは次のようにします。

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

2 に答える 2

6

私自身の質問に答える:

Railsの初期化プロセス中にデータベース接続が実際に初期化されるかどうかは、基本的に、初期化プロセス中にActiveRecord::Base.connection(not establish_connection) が呼び出されるかどうかによって異なります。

これは、Rails のバージョンに関連している可能性がありますconnection

!ActiveRecord::Base.connection.supports_explain?

Rails 3.2.14 では、この呼び出しは行われません。

ただし、Rails 3.2.14 はconnection「active_record.set_reloader_hooks」イニシャライザーで呼び出しを行う場合があります。この呼び出しは、コマンドで発生する可能性があります

ActiveRecord::Base.clear_cache!

prepareコールバックランナーが常にこれを呼び出すとは限りませんが...

また、いくつかの gem (例: ) には、ある時点でActiveAdmin呼び出す初期化プロセスがあることもわかりました。connection

于 2013-08-12T15:41:07.147 に答える