提交 6889e720 编写于 作者: E Eileen M. Uchitelle 提交者: GitHub

Merge pull request #34196 from gmcgibbon/connection_switch_string_name

Add support for hash and url configs to be used in connected_to
* Add support for hash and url configs in database hash of `ActiveRecord::Base.connected_to`.
````
User.connected_to(database: { writing: "postgres://foo" }) do
User.create!(name: "Gannon")
end
config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
User.connected_to(database: { reading: config }) do
User.count
end
````
*Gannon McGibbon*
* Support default expression for MySQL.
MySQL 8.0.13 and higher supports default value to be a function or expression.
......
......@@ -109,12 +109,15 @@ def connected_to(database: nil, role: nil, &blk)
if database && role
raise ArgumentError, "connected_to can only accept a database or role argument, but not both arguments."
elsif database
config_hash = resolve_config_for_connection(database)
handler = lookup_connection_handler(database.to_sym)
with_handler(database.to_sym) do
handler.establish_connection(config_hash)
return yield
database = { database => database } if database.is_a?(Symbol)
database.each do |role, database_key|
config_hash = resolve_config_for_connection(database_key)
handler = lookup_connection_handler(role.to_sym)
with_handler(role.to_sym) do
handler.establish_connection(config_hash)
return yield
end
end
elsif role
with_handler(role.to_sym, &blk)
......
......@@ -120,6 +120,45 @@ def test_switching_connections_via_handler
ENV["RAILS_ENV"] = previous_env
end
def test_switching_connections_with_database_url
previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
previous_url, ENV["DATABASE_URL"] = ENV["DATABASE_URL"], "postgres://localhost/foo"
ActiveRecord::Base.connected_to(database: { writing: "postgres://localhost/bar" }) do
handler = ActiveRecord::Base.connection_handler
assert_equal handler, ActiveRecord::Base.connection_handlers[:writing]
end
ensure
ActiveRecord::Base.establish_connection(:arunit)
ENV["RAILS_ENV"] = previous_env
ENV["DATABASE_URL"] = previous_url
end
def test_switching_connections_with_database_config_hash
previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
ActiveRecord::Base.connected_to(database: { writing: config }) do
handler = ActiveRecord::Base.connection_handler
assert_equal handler, ActiveRecord::Base.connection_handlers[:writing]
end
ensure
ActiveRecord::Base.establish_connection(:arunit)
ENV["RAILS_ENV"] = previous_env
end
def test_switching_connections_with_database_symbol
previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "default_env"
ActiveRecord::Base.connected_to(database: :arunit2) do
handler = ActiveRecord::Base.connection_handler
assert_equal handler, ActiveRecord::Base.connection_handlers[:arunit2]
end
ensure
ActiveRecord::Base.establish_connection(:arunit)
ENV["RAILS_ENV"] = previous_env
end
def test_connects_to_with_single_configuration
config = {
"development" => { "adapter" => "sqlite3", "database" => "db/primary.sqlite3" },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册