在我的一些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
答案 0 :(得分:6)
回答我自己的问题:
在Rails初始化过程中是否实际初始化数据库连接主要取决于在初始化过程中是否调用ActiveRecord::Base.connection
(不是establish_connection
)。
这可能与Rails版本有关:例如,在Rails 3.2.13中,“active_record.validate_explain_support”初始化程序调用{{1}}:
connection
在Rails 3.2.14中,没有进行此调用。
但是,Rails 3.2.14可能会调用“active_record.set_reloader_hooks”初始值设定项中的!ActiveRecord::Base.connection.supports_explain?
。使用命令
connection
虽然ActiveRecord::Base.clear_cache!
回调运动员似乎并不总是称之为......
我还发现某些宝石(例如prepare
)有一个初始化过程,会在某个时刻调用ActiveAdmin
。
答案 1 :(得分:0)
我无法为您提供准确的解决方案,因为可能有多种原因导致存在一些差异。
假设您没有重写connected?
方法,当Rails模型可以与其后端建立连接时,它返回true。请注意,当我说后端时,它可以是您机器中的本地数据库,工作中VPN中的远程数据库,或者是Amazon RDS提供的远程数据库。它可能因您的Rails环境,数据库配置和Rails应用程序而异。因此,检查其连接所需的时间可能因情况而异。
当它无法建立与其后端的连接时,它将返回false。同样,这可能是由于许多原因造成的。您的数据库配置可能不正确。您的远程数据库可能已关闭。也可以通过设计来预期。例如,如果你有一个使用activemodel的模型,但是使用json与某些API而不是传统数据库进行通信,那么它将返回false,因为模型表不在数据库中。
我希望这会有所帮助。