On this page
module ActiveRecord::ConnectionHandling
Constants
- DEFAULT_ENV
- RAILS_ENV
Attributes
Public Instance Methods
# File activerecord/lib/active_record/connection_handling.rb, line 187
def clear_query_caches_for_current_thread
  ActiveRecord::Base.connection_handlers.each_value do |handler|
    handler.connection_pool_list.each do |pool|
      pool.connection.clear_query_cache if pool.active_connection?
    end
  end
endClears the query cache for all connections associated with the current thread.
# File activerecord/lib/active_record/connection_handling.rb, line 235
def connected?
  connection_handler.connected?(connection_specification_name)
endReturns true if Active Record is connected.
# File activerecord/lib/active_record/connection_handling.rb, line 117
def connected_to(database: nil, role: nil, &blk)
  if database && role
    raise ArgumentError, "connected_to can only accept a `database` or a `role` argument, but not both arguments."
  elsif database
    if database.is_a?(Hash)
      role, database = database.first
      role = role.to_sym
    end
    config_hash = resolve_config_for_connection(database)
    handler = lookup_connection_handler(role)
    handler.establish_connection(config_hash)
    with_handler(role, &blk)
  elsif role
    with_handler(role.to_sym, &blk)
  else
    raise ArgumentError, "must provide a `database` or a `role`."
  end
endConnects to a database or role (ex writing, reading, or another custom role) for the duration of the block.
If a role is passed, Active Record will look up the connection based on the requested role:
ActiveRecord::Base.connected_to(role: :writing) do
  Dog.create! # creates dog using dog writing connection
end
ActiveRecord::Base.connected_to(role: :reading) do
  Dog.create! # throws exception because we're on a replica
end
ActiveRecord::Base.connected_to(role: :unknown_role) do
  # raises exception due to non-existent role
end
For cases where you may want to connect to a database outside of the model, you can use connected_to with a database argument. The database argument expects a symbol that corresponds to the database key in your config.
ActiveRecord::Base.connected_to(database: :animals_slow_replica) do
  Dog.run_a_long_query # runs a long query while connected to the +animals_slow_replica+
end
This will connect to a new database for the queries inside the block. By default the `:writing` role will be used since all connections must be assigned a role. If you would like to use a different role you can pass a hash to database:
ActiveRecord::Base.connected_to(database: { readonly_slow: :animals_slow_replica }) do
  # runs a long query while connected to the +animals_slow_replica+ using the readonly_slow role.
  Dog.run_a_long_query
end
When using the database key a new connection will be established every time.
# File activerecord/lib/active_record/connection_handling.rb, line 145
def connected_to?(role:)
  current_role == role.to_sym
endReturns true if role is the current connected role.
ActiveRecord::Base.connected_to(role: :writing) do
  ActiveRecord::Base.connected_to?(role: :writing) #=> true
  ActiveRecord::Base.connected_to?(role: :reading) #=> false
end
# File activerecord/lib/active_record/connection_handling.rb, line 198
def connection
  retrieve_connection
endReturns the connection currently associated with the class. This can also be used to “borrow” the connection to do database work unrelated to any of the specific Active Records.
# File activerecord/lib/active_record/connection_handling.rb, line 222
def connection_config
  connection_pool.spec.config
endReturns the configuration of the associated connection as a hash:
ActiveRecord::Base.connection_config
# => {pool: 5, timeout: 5000, database: "db/development.sqlite3", adapter: "sqlite3"}
Please use only for reading.
# File activerecord/lib/active_record/connection_handling.rb, line 226
def connection_pool
  connection_handler.retrieve_connection_pool(connection_specification_name) || raise(ConnectionNotEstablished)
end# File activerecord/lib/active_record/connection_handling.rb, line 205
def connection_specification_name
  if !defined?(@connection_specification_name) || @connection_specification_name.nil?
    return primary_class? ? "primary" : superclass.connection_specification_name
  end
  @connection_specification_name
endReturn the specification name from the current class or its parent.
# File activerecord/lib/active_record/connection_handling.rb, line 68
def connects_to(database: {})
  connections = []
  database.each do |role, database_key|
    config_hash = resolve_config_for_connection(database_key)
    handler = lookup_connection_handler(role.to_sym)
    connections << handler.establish_connection(config_hash)
  end
  connections
endConnects a model to the databases specified. The database keyword takes a hash consisting of a role and a database_key.
This will create a connection handler for switching between connections, look up the config hash using the database_key and finally establishes a connection to that config.
class AnimalsModel < ApplicationRecord
  self.abstract_class = true
  connects_to database: { writing: :primary, reading: :primary_replica }
end
Returns an array of established connections.
# File activerecord/lib/active_record/connection_handling.rb, line 158
def current_role
  connection_handlers.key(connection_handler)
endReturns the symbol representing the current connected role.
ActiveRecord::Base.connected_to(role: :writing) do
  ActiveRecord::Base.current_role #=> :writing
end
ActiveRecord::Base.connected_to(role: :reading) do
  ActiveRecord::Base.current_role #=> :reading
end
# File activerecord/lib/active_record/connection_handling.rb, line 49
def establish_connection(config_or_env = nil)
  config_hash = resolve_config_for_connection(config_or_env)
  connection_handler.establish_connection(config_hash)
endEstablishes the connection to the database. Accepts a hash as input where the :adapter key must be specified with the name of a database adapter (in lower-case) example for regular databases (MySQL, PostgreSQL, etc):
ActiveRecord::Base.establish_connection(
  adapter:  "mysql2",
  host:     "localhost",
  username: "myuser",
  password: "mypass",
  database: "somedatabase"
)
Example for SQLite database:
ActiveRecord::Base.establish_connection(
  adapter:  "sqlite3",
  database: "path/to/dbfile"
)
Also accepts keys as strings (for parsing from YAML for example):
ActiveRecord::Base.establish_connection(
  "adapter"  => "sqlite3",
  "database" => "path/to/dbfile"
)
Or a URL:
ActiveRecord::Base.establish_connection(
  "postgres://myuser:mypass@localhost/somedatabase"
)
In case ActiveRecord::Base.configurations is set (Rails automatically loads the contents of config/database.yml into it), a symbol can also be given as argument, representing a key in the configuration hash:
ActiveRecord::Base.establish_connection(:production)
The exceptions AdapterNotSpecified, AdapterNotFound and ArgumentError may be returned on an error.
# File activerecord/lib/active_record/connection_handling.rb, line 239
def remove_connection(name = nil)
  name ||= @connection_specification_name if defined?(@connection_specification_name)
  # if removing a connection that has a pool, we reset the
  # connection_specification_name so it will use the parent
  # pool.
  if connection_handler.retrieve_connection_pool(name)
    self.connection_specification_name = nil
  end
  connection_handler.remove_connection(name)
end# File activerecord/lib/active_record/connection_handling.rb, line 230
def retrieve_connection
  connection_handler.retrieve_connection(connection_specification_name)
end© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.