我开发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?
将为真。为什么?我不明白。
答案 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中应该依赖于目录。