7

在我的一些 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
4

2 回答 2

6

回答我自己的问题:

在 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回调运行器似乎并不总是这样调用......

我还发现一些 gem(例如)有一个会在某个时候ActiveAdmin调用的初始化过程。connection

于 2013-08-12T15:41:07.147 回答
0

我无法为您提供确切的解决方案,因为存在一些差异可能有多种原因。

假设您没有重写connected?方法,当 Rails 模型可以建立与其后端的连接时,它会返回 true。请注意,当我说后端时,它可以是您机器中的本地数据库、您工作时 VPN 中的远程数据库,或者是 Amazon RDS 提供的远程数据库。它可以根据您的 Rails 环境、数据库配置和 Rails 应用程序而有所不同。因此,检查其连接所需的时间可能因情况而异。

当它无法与后端建立连接时,它将返回 false。同样,这可能是由于许多原因。您的数据库配置可能不正确。您的远程数据库可能已关闭。这也可能是设计所期望的。例如,如果您有一个使用 activemodel 的模型,但使用 json 与某些 API 而不是常规数据库进行通信,它将返回 false,因为模型表不在数据库中。

我希望这有帮助。

于 2013-08-09T20:16:13.743 回答