首页 > 解决方案 > 如何加载自定义数据库适配器?以便在评估“database.yml”时准备好?

问题描述

在rails 4中,我正在尝试编写自己的数据库适配器,但是,似乎database.yml在加载我的适配器之前对其进行了评估,从而导致错误:

Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.

我的客户适配器位于,我在使用lib/active_record/connection_handling/proxy_mysql2_adapter.rb 时加载它的尝试不起作用,因为它不是在评估之前加载的。config/application.rbconfig.eager_load_pathsconfig/database.yml

我将如何加载我的数据库适配器?以便在database.yml评估时准备好?

以上是完整的错误:

App 25085 output: Error: The application encountered the following error: Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile. (LoadError)
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_adapters/connection_specification.rb:175:in `spec'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_handling.rb:50:in `establish_connection'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-import-0.13.0/lib/activerecord-import.rb:7:in `establish_connection_with_activerecord_import'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/railtie.rb:120:in `block (2 levels) in <class:Railtie>'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:38:in `instance_eval'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:38:in `execute_hook'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:28:in `block in on_load'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:27:in `each'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activesupport-4.2.6/lib/active_support/lazy_load_hooks.rb:27:in `on_load'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/activerecord-4.2.6/lib/active_record/railtie.rb:116:in `block in <class:Railtie>'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `instance_exec'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `run'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:55:in `block in run_initializers'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `call'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each'
App 25085 output:     /home/deploy/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:54:in `run_initializers'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/railties-4.2.6/lib/rails/application.rb:352:in `initialize!'
App 25085 output:     /var/www/backend/releases/20200310141409/config/environment.rb:5:in `<top (required)>'
App 25085 output:     config.ru:3:in `require'
App 25085 output:     config.ru:3:in `block in <main>'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/rack-1.6.13/lib/rack/builder.rb:55:in `instance_eval'
App 25085 output:     /var/www/backend/shared/bundle/ruby/2.3.0/gems/rack-1.6.13/lib/rack/builder.rb:55:in `initialize'
App 25085 output:     config.ru:1:in `new'
App 25085 output:     config.ru:1:in `<main>'
App 25085 output:     /usr/share/passenger/helper-scripts/rack-preloader.rb:101:in `eval'
App 25085 output:     /usr/share/passenger/helper-scripts/rack-preloader.rb:101:in `preload_app'
App 25085 output:     /usr/share/passenger/helper-scripts/rack-preloader.rb:189:in `block in <module:App>'
App 25085 output:     /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:380:in `run_block_and_record_step_progress'
App 25085 output:     /usr/share/passenger/helper-scripts/rack-preloader.rb:188:in `<module:App>'
App 25085 output:     /usr/share/passenger/helper-scripts/rack-preloader.rb:30:in `<module:PhusionPassenger>'
App 25085 output:     /usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `<main>'
[ E 2020-03-10 15:22:10.0768 25063/Tf age/Cor/App/Implementation.cpp:221 ]: Could not spawn process for application /var/www/backend/current: The application encountered the following error: Could not load 'active_record/connection_adapters/proxy_mysql2_adapter'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile. (LoadError)
  Error ID: 91fbd9ce
  Error details saved to: /tmp/passenger-error-qdkLuQ.html

编辑2

我试图将它放入初始化程序文件夹,但我得到了相同的结果,完整的适配器可以在这里找到:https ://gist.github.com/arthurchui/f4d1d74d5e91f5307b5c6c78bdfde365

标签: ruby-on-railsruby-on-rails-4rails-activerecord

解决方案


Rails 只需要该文件位于加载路径上,您可以将其放置在$LOAD_PATHbundler 初始化之后但在加载应用程序之前的目录之一中,因此<rails_root>/lib/active_record/connection_adapters/proxy_mysql2_adapter.rb是合适的。

确保它不会引发LoadErrorGem::LoadError加载 - 如果您的适配器无法要求其他一些依赖项,rails 会认为它找不到适配器或其 gem。


推荐阅读