在我的一些 Rails 应用程序中,我的 ActiveRecord 模型似乎在初始化时建立数据库连接(例如,当我这样做时rails console
),而在其他情况下,连接似乎仅在我引用模型类或实例化模型对象时才建立。
例如,我刚刚转到一个应用程序,打开 Rails 控制台并写道:
SomeModel.connected?
它回来了false
。我转到另一个应用程序,输入相同的命令(针对不同的模型),然后它返回true
。我转到第三个应用程序并输入相同的命令。这次,它等了一会儿,又回来了true
,这让我想到connected?
方法由于某种原因触发了连接。
这种行为差异似乎与 Rails 版本或模型内容无关。我在初始化程序中所做的事情可能很奇怪,但我不这么认为。
那么Rails什么时候建立连接呢?或者预期的行为是什么?
附加信息
我补充一下,看起来不像connected?
返回 false 因为 Railscannot连接到数据库。
例如,在我的第一个应用程序中,我这样做:
SomeModel.connected?
# => false
SomeModel.table_exists? # or any other command that makes Rails look at db
# => true
SomeModel.connected?
# => true
回答我自己的问题:
Rails 初始化过程中是否真正初始化了数据库连接基本上取决于是否ActiveRecord::Base.connection
(not establish_connection
) 在初始化过程中被调用。
这可能与 Rails 版本有关:例如,在 Rails 3.2.13 中,“active_record.validate_explain_support”初始化程序调用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
回调跑步者似乎并不总是这样称呼......
我还发现了一些宝石(例如,ActiveAdmin
)有一个初始化过程将调用connection
在某一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)