为什么ActiveRecord :: Base.connected?调用establish_connection后为false

时间:2010-08-18 18:27:47

标签: ruby testing activerecord

我开发Sinatra应用程序并使用ActiveRecord来处理数据库,但我遇到了一个问题。我为一个模型编写了一个测试,它打破了

SQLite3 :: CantOpenException:无法打开数据库文件

使用以下代码在test_helper.rb中建立与数据库的连接:

Dir.chdir('..') do
  ActiveRecord::Base.establish_connection(db_config)
end

ActiveRecord::Base.connected?变为假。如果我在连接建立测试通过后调用User.find(:all)ActiveRecord::Base.connected?将为真。为什么?我不明白。

3 个答案:

答案 0 :(得分:6)

ActiveRecord::Base.establish_connection仅设置连接,并且在请求与数据库的连接之前,ActiveRecord实际上不会连接。 以下代码可以帮助您强制ActiveRecord为连接池建立连接:

connected = ActiveRecord::Base.connection_pool.with_connection { |con| con.active? }  rescue false

rescue false隐藏了几个潜在的例外(例如PG::ConnectionBad)。 有关详细信息,请参阅documentation of :with_connection

答案 1 :(得分:1)

ActiveRecord :: Base.establish_connection被委托给ActiveRecord :: ConnectionAdapters :: ConnectionHandler #stablish_connection,如果你查看它的implementation,你会看到它只是创建一个连接拉

答案 2 :(得分:0)

确保并为您的测试环境运行rake db:create。看起来DB不存在,而且在SQLite中应该依赖于目录。