aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorJohn Crepezzi <seejohnrun@github.com>2019-07-23 15:55:48 -0400
committerJohn Crepezzi <seejohnrun@github.com>2019-07-24 16:31:24 -0400
commit396dba08741b2c1d5a41debbb4bbde799c9f2a31 (patch)
treea7e29cc3e0dfc322347f29678530e47ec2d1e708 /activerecord/lib
parent9c913116c634fe5fe2159a94b8f1a244801a4877 (diff)
downloadrails-396dba08741b2c1d5a41debbb4bbde799c9f2a31.tar.gz
rails-396dba08741b2c1d5a41debbb4bbde799c9f2a31.tar.bz2
rails-396dba08741b2c1d5a41debbb4bbde799c9f2a31.zip
Fix multiple database support for DATABASE_URL env variable
This commit fixes an issue where multi-database configurations were incompatible with setting a `DATABASE_URL` environment variable. As part of this work, this commit also includes a light refactor to make both multi and single database configurations lead into the same code path so they behave the same. As mentioned in #36736, this regression was introduced as part of f2ad69fe7a605b01bb7c37eeac6a9b4e7deb488e
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/database_configurations.rb30
1 files changed, 18 insertions, 12 deletions
diff --git a/activerecord/lib/active_record/database_configurations.rb b/activerecord/lib/active_record/database_configurations.rb
index bf31bb7c22..e122628b05 100644
--- a/activerecord/lib/active_record/database_configurations.rb
+++ b/activerecord/lib/active_record/database_configurations.rb
@@ -104,18 +104,28 @@ module ActiveRecord
return configs.configurations if configs.is_a?(DatabaseConfigurations)
return configs if configs.is_a?(Array)
- build_db_config = configs.each_pair.flat_map do |env_name, config|
- walk_configs(env_name.to_s, "primary", config)
- end.flatten.compact
+ db_configs = configs.flat_map do |env_name, config|
+ if config.is_a?(Hash) && config.all? { |k, v| v.is_a?(Hash) }
+ walk_configs(env_name.to_s, config)
+ else
+ build_db_config_from_raw_config(env_name.to_s, "primary", config)
+ end
+ end.compact
if url = ENV["DATABASE_URL"]
- build_url_config(url, build_db_config)
+ merge_url_with_configs(url, db_configs)
else
- build_db_config
+ db_configs
+ end
+ end
+
+ def walk_configs(env_name, config)
+ config.map do |spec_name, sub_config|
+ build_db_config_from_raw_config(env_name, spec_name.to_s, sub_config)
end
end
- def walk_configs(env_name, spec_name, config)
+ def build_db_config_from_raw_config(env_name, spec_name, config)
case config
when String
build_db_config_from_string(env_name, spec_name, config)
@@ -141,16 +151,12 @@ module ActiveRecord
config_without_url.delete "url"
ActiveRecord::DatabaseConfigurations::UrlConfig.new(env_name, spec_name, url, config_without_url)
- elsif config["database"] || config["adapter"] || ENV["DATABASE_URL"]
- ActiveRecord::DatabaseConfigurations::HashConfig.new(env_name, spec_name, config)
else
- config.each_pair.map do |sub_spec_name, sub_config|
- walk_configs(env_name, sub_spec_name, sub_config)
- end
+ ActiveRecord::DatabaseConfigurations::HashConfig.new(env_name, spec_name, config)
end
end
- def build_url_config(url, configs)
+ def merge_url_with_configs(url, configs)
env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s
if configs.find(&:for_current_env?)