ActiveRecord何时建立连接?
在我的一些Rails应用程序中,我的ActiveRecord模型似乎在初始化时建立数据库连接(例如,当我执行rails console
),而在其他连接中,似乎只有在我引用模型类或实例化模型对象时才建立连接。
例如,我只去了一个应用程序,打开了Rails控制台并写道:
SomeModel.connected?
它返回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
回答我自己的问题:
在Rails初始化过程中是否实际初始化数据库连接主要取决于在初始化过程中是否调用ActiveRecord::Base.connection
(不是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可能会在“active_record.set_reloader_hooks”初始化程序中调用connection
。 使用该命令可能会发生此调用
ActiveRecord::Base.clear_cache!
虽然prepare
回调跑步者似乎并不总是这样称呼…
我还发现一些gem(例如, ActiveAdmin
)有一个初始化过程,它会在某个时刻调用connection
。
我不能为您提供确切的解决方案,因为可能有几个原因导致存在一些差异。
假设你没有重写connected?
方法,当Rails模型可以建立与其后端的连接时,它返回true。 请注意,当我说后端时,它可以是您机器中的本地数据库,工作中VPN中的远程数据库,或者是Amazon RDS提供的远程数据库。 它可以根据您的Rails环境,数据库配置和Rails应用程序而有所不同。 因此,检查其连接所需的时间因情况而异。
当它无法与其后端建立连接时,它将返回false。 同样,这可能是由于许多原因造成的。 您的数据库配置可能不正确。 您的远程数据库可能已关闭。 也可以通过设计来预期。 例如,如果您有一个使用activemodel的模型,但使用json与某些API而不是传统数据库进行通信,则它将返回false,因为模型表不在数据库中。
我希望这有帮助。