Почему ActiveRecord:: Base.connected? false, после вызова установления_соединения
Я разрабатываю приложение Sinatra и использую там ActiveRecord для работы с базой данных, но я столкнулся с одной проблемой. Я написал тест для модели и разбился на
SQLite3:: CantOpenException: невозможно открыть файл базы данных
Соединение с базой данных устанавливается в test_helper.rb со следующим кодом:
Dir.chdir('..') do
ActiveRecord::Base.establish_connection(db_config)
end
и ActiveRecord::Base.connected?
получают значение false. Если я вызываю User.find(:all)
, например, после завершения установления соединения, и ActiveRecord::Base.connected?
будет true. Зачем? Я не понимаю.
Ответы
Ответ 1
ActiveRecord::Base.establish_connection
устанавливает только соединение, и ActiveRecord фактически не подключается, пока не будет запрошено соединение с базой данных.
Следующий код может помочь заставить ActiveRecord установить соединение для пула соединений:
connected = ActiveRecord::Base.connection_pool.with_connection { |con| con.active? } rescue false
rescue false
скрывает пару потенциальных исключений (например, PG::ConnectionBad
).
Для получения дополнительной информации см. Документацию : with_connection.
Ответ 2
ActiveRecord:: Base.establish_connection делегируется ActiveRecord:: ConnectionAdapters:: ConnectionHandler # stablish_connection, и если вы посмотрите на реализацию, вы Посмотрим, что он просто создает соединение pull
Ответ 3
Удостоверьтесь и запустите rake db:create
для вашей тестовой среды. Похоже, что DB не существует и в SQLite, который должен зависеть от каталога.