diff --git a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb index 347d794fa33f92f361c3e65a0ff08c4e4245d945..1f731036c9acc8b9bfbf5e5c5bd7b6aefafec5e0 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb @@ -505,9 +505,9 @@ def connection_pools @connection_pools[Process.pid] end - def establish_connection(name, spec) + def establish_connection(klass, spec) set_pool_for_spec spec, ConnectionAdapters::ConnectionPool.new(spec) - set_class_to_pool name, connection_pools[spec] + set_class_to_pool klass, connection_pools[spec] end # Returns true if there are any active connections among the connection @@ -553,7 +553,7 @@ def connected?(klass) # can be used as an argument for establish_connection, for easily # re-establishing the connection. def remove_connection(klass) - pool = class_to_pool.delete(klass.name) + pool = class_to_pool.delete(klass) return nil unless pool connection_pools.delete pool.spec @@ -563,12 +563,15 @@ def remove_connection(klass) end def retrieve_connection_pool(klass) - if !(klass < Model::Tag) - get_pool_for_class('ActiveRecord::Model') # default connection - else - pool = get_pool_for_class(klass.name) - pool || retrieve_connection_pool(klass.superclass) + pool = get_pool_for_class(klass) + + until pool + klass = klass.superclass + break unless klass < Model::Tag + pool = get_pool_for_class(klass) end + + pool || get_pool_for_class(ActiveRecord::Model) end private @@ -581,8 +584,8 @@ def set_pool_for_spec(spec, pool) @connection_pools[Process.pid][spec] = pool end - def set_class_to_pool(name, pool) - @class_to_pool[Process.pid][name] = pool + def set_class_to_pool(klass, pool) + @class_to_pool[Process.pid][klass] = pool pool end diff --git a/activerecord/lib/active_record/connection_handling.rb b/activerecord/lib/active_record/connection_handling.rb index 7863c795ed2d6b5d47c246a37be43b904461fe2e..3531be05bfb00c3c11782436856e26d7238849df 100644 --- a/activerecord/lib/active_record/connection_handling.rb +++ b/activerecord/lib/active_record/connection_handling.rb @@ -44,7 +44,7 @@ def establish_connection(spec = ENV["DATABASE_URL"]) end remove_connection - connection_handler.establish_connection name, spec + connection_handler.establish_connection self, spec end # Returns the connection currently associated with the class. This can diff --git a/activerecord/test/cases/connection_adapters/connection_handler_test.rb b/activerecord/test/cases/connection_adapters/connection_handler_test.rb index 17cb447105a20dec6eebd77e162a0035b0789da7..2286ef139137f2ed92556995d7049e21e9f8d650 100644 --- a/activerecord/test/cases/connection_adapters/connection_handler_test.rb +++ b/activerecord/test/cases/connection_adapters/connection_handler_test.rb @@ -4,16 +4,11 @@ module ActiveRecord module ConnectionAdapters class ConnectionHandlerTest < ActiveRecord::TestCase def setup + @klass = Class.new { include Model::Tag } + @subklass = Class.new(@klass) { include Model::Tag } + @handler = ConnectionHandler.new - @handler.establish_connection 'america', Base.connection_pool.spec - @klass = Class.new do - include Model::Tag - def self.name; 'america'; end - end - @subklass = Class.new(@klass) do - include Model::Tag - def self.name; 'north america'; end - end + @handler.establish_connection @klass, Base.connection_pool.spec end def test_retrieve_connection