Почему 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, который должен зависеть от каталога.