如何加载自定义数据库适配器?以便在评估`database.yml`时准备就绪?

问题描述 投票:0回答:1

在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.rb将其加载到config.eager_load_paths的尝试无效,因为未在config/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

EDIT2

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

ruby-on-rails ruby-on-rails-4 rails-activerecord
1个回答
0
投票

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

请确保它在加载时不会引发LoadErrorGem::LoadError-如果您的适配器无法要求其他依赖关系,Rails会认为它找不到适配器或它的gem。

© www.soinside.com 2019 - 2024. All rights reserved.