2013-08-09 16 views
5

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

例えば、私は、一つのアプリケーションに行ってきましたRailsのコンソールを開いて、こう書いています

SomeModel.connected? 

、それはfalseを返しました。私は別のアプリケーションに行って、同じコマンドを(別のモデルのために)入力し、trueを返しました。私は3番目のアプリケーションに行き、同じコマンドを入力しました。今回はちょっと待ってからtrueを返しました。何らかの理由でconnected?メソッドが接続を開始したと思いました。

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

したがって、いつRailsが接続を確立しますか?または、期待される行動は何ですか?

ADDITIONAL INFO

Railsのがデータベースに接続できないので、私はそれがconnected?戻りますように偽思われないことを追加します。

は例えば、私の最初のアプリケーションで私がやる:いくつかの相違があるいくつかの理由があるかもしれないので、

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

答えて

4

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

これは、Railsのバージョンに関連している可能性があります。たとえば、Rails 3.2.13では、 "active_record。validate_explain_support "初期化子がconnectionに呼び出します:Railsの3.2.14で

!ActiveRecord::Base.connection.supports_explain? 

を、この呼び出しが行われていない

しかし、Railsの3.2.14がでconnectionへの呼び出しを行うことができる。" active_record.set_reloader_hooks prepareコールバックランナーは常にこれを呼び出すようには見えませんが、「初期化子。この呼び出しは...

コマンド

ActiveRecord::Base.clear_cache! 

で発生する可能性があります

一部の宝石(例:ActiveAdmin)には、ある時点でconnectionを呼び出す初期化プロセスがあります。

+1

おそらく関連するコミットはhttps://github.com/rails/rails/commit/7423a71fc02c0ca3bf37b94e16a1322c0caaa6fd、https://github.com/rails/rails/commit/85cc7122bab1cfec661fdfe3bf4738d9fba55399です。悲しいことに、後者は3.2.x – sayap

+1

にバックポートされていません。これもコミットします:https://github.com/rails/rails/commit/d3688e02ca52c0b72d3092e8498da51e06b7fc58 – sayap

+0

@sayap、リンクありがとう。それらは本当に意図された/予想される行動を説明するのに役立ちます –

0

私はあなたに正確なソリューションを提供することはできません。

connected?メソッドを書き換えていないと仮定すると、Railsモデルがバックエンドへの接続を確立できるとtrueを返します。私がバックエンドと言うとき、それはあなたのマシンのローカルデータベース、あなたの仕事場のあなたのVPNのリモートデータベース、または遠方のデータベースをAmazon RDSから遠く離れた場所にすることができます。これは、Rails環境、データベース設定、およびRailsアプリケーションに基づいて異なる場合があります。その接続を確認するのにかかる時間は、ケースごとに異なる場合があります。

バックエンドへの接続を確立できない場合はfalseを返します。再び、これは多くの理由が原因である可能性があります。データベースの設定が正しくない可能性があります。リモートデータベースがダウンしている可能性があります。設計上も期待されるかもしれません。たとえば、activemodelを使用するモデルがあり、jsonを使用して従来のデータベースではなくAPIと通信する場合、モデルテーブルがデータベースにないため、falseが返されます。

こちらがお役に立てば幸いです。自分の質問に答える

+0

お返事ありがとうございます。この場合、データベース接続の問題ではありません。上の追加情報を参照してください。私は 'connected? 'やその他の' ActiveRecord'メソッドを書き直していません。 –

+0

schema.rbはデータベースと正確に一致していますか? –

+0

はい(私はただSQLiteを使用しています)。 –

関連する問題