ActiveRecord何时建立连接?

Jac*_*own 7 activerecord ruby-on-rails

在我的一些Rails应用程序中,我的ActiveRecord模型似乎在初始化时建立数据库连接(例如,当我这样做时rails console),而在其他应用程序中,似乎只有在我引用模型类或实例化模型对象时才建立连接.

例如,我只去了一个应用程序,打开了Rails控制台并写道:

SomeModel.connected?
Run Code Online (Sandbox Code Playgroud)

它又归来了false.我去了另一个应用程序,输入了相同的命令(对于不同的模型),然后返回true.我去了第三个应用程序并输入了相同的命令.这一次,它等了片刻然后返回true,这让我觉得该connected?方法由于某种原因触发了连接.

这种行为差异似乎与Rails版本或模型的内容无关.这可能是我在初始化程序中所做的奇怪事情,但我不这么认为.

那么Rails何时建立连接?或者预期的行为是什么?

附加信息

我将补充说,它似乎不会connected?返回false,因为Rails 无法连接到数据库.

例如,在我的第一个应用程序中,我做了:

SomeModel.connected?
# => false
SomeModel.table_exists? # or any other command that makes Rails look at db
# => true
SomeModel.connected?
# => true
Run Code Online (Sandbox Code Playgroud)

Jac*_*own 6

回答我自己的问题:

在Rails初始化过程中是否实际初始化数据库连接主要取决于在初始化过程中是否调用ActiveRecord::Base.connection(非establish_connection).

这可能与Rails版本有关:例如,在Rails 3.2.13中,"active_record.validate_explain_support"初始化程序调用connection:

!ActiveRecord::Base.connection.supports_explain?
Run Code Online (Sandbox Code Playgroud)

在Rails 3.2.14中,没有进行此调用.

但是,Rails 3.2.14可以connection在"active_record.set_reloader_hooks"初始化程序中进行调用.使用该命令可能会发生此调用

ActiveRecord::Base.clear_cache!
Run Code Online (Sandbox Code Playgroud)

虽然prepare回调跑步者似乎并不总是称之为......

我还发现一些宝石(例如ActiveAdmin)有一个初始化过程,会connection在某个时刻调用.