модуль ActiveRecord::ConnectionHandling
Константы
- DEFAULT_ENV
- RAILS_ENV
Атрибуты
Публичные методы экземпляров
# 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
end Очищает кэш запросов для всех подключений, связанных с текущей нитью.
# File activerecord/lib/active_record/connection_handling.rb, line 235 def connected? connection_handler.connected?(connection_specification_name) end
Возвращает true , если Active Record подключен.
# 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
end Подключается к базе данных или роли (например, записи, чтения или другой пользовательской роли) на время выполнения блока.
Если передана роль, Active Record найдет подключение, соответствующее запрошенной роли:
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
В случаях, когда вам необходимо подключиться к базе данных вне модели, вы можете использовать connected_to с аргументом database. Аргумент database ожидает символ, соответствующий ключу базы данных в вашей конфигурации.
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
Это подключится к новой базе данных для запросов внутри блока. По умолчанию будет использоваться роль `:writing`, так как всем подключениям должна быть назначена роль. Если вы хотите использовать другую роль, вы можете передать хэш в `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
При использовании ключа базы данных новое подключение будет устанавливаться каждый раз.
# File activerecord/lib/active_record/connection_handling.rb, line 145 def connected_to?(role:) current_role == role.to_sym end
Возвращает true, если роль является текущей подключенной ролью.
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 end
Возвращает подключение, в настоящее время связанное с классом. Это также может быть использовано для «одолжения» подключения для выполнения работы с базой данных, не связанной ни с одним из конкретных Active Records.
# File activerecord/lib/active_record/connection_handling.rb, line 222 def connection_config connection_pool.spec.config end
Возвращает конфигурацию связанного подключения в виде хэша:
ActiveRecord::Base.connection_config
# => {pool: 5, timeout: 5000, database: "db/development.sqlite3", adapter: "sqlite3"}
Используйте только для чтения.
# 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
end Возвращает имя спецификации подключения из текущего класса или его родителя.
# 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
end Подключает модель к указанным базам данных. Ключевое слово database принимает хэш, состоящий из role и database_key.
Это создаст обработчик подключения для переключения между подключениями, найдет хэш конфигурации с помощью database_key и, наконец, установит подключение к этой конфигурации.
class AnimalsModel < ApplicationRecord
self.abstract_class = true
connects_to database: { writing: :primary, reading: :primary_replica }
end
Возвращает массив установленных подключений.
# File activerecord/lib/active_record/connection_handling.rb, line 158 def current_role connection_handlers.key(connection_handler) end
Возвращает символ, представляющий текущую подключенную роль.
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) end
Устанавливает подключение к базе данных. Принимает хэш в качестве входного значения, где ключ :adapter должен быть указан с именем адаптера базы данных (в нижнем регистре) пример для обычных баз данных (MySQL, PostgreSQL и т. д.):
ActiveRecord::Base.establish_connection( adapter: "mysql2", host: "localhost", username: "myuser", password: "mypass", database: "somedatabase" )
Пример для базы данных SQLite:
ActiveRecord::Base.establish_connection( adapter: "sqlite3", database: "path/to/dbfile" )
Также принимает ключи как строки (например, для разбора из YAML):
ActiveRecord::Base.establish_connection( "adapter" => "sqlite3", "database" => "path/to/dbfile" )
Или URL:
ActiveRecord::Base.establish_connection( "postgres://myuser:mypass@localhost/somedatabase" )
В случае, если ActiveRecord::Base.configurations установлено (Rails автоматически загружает содержимое config/database.yml в него), в качестве аргумента также может быть передан символ, представляющий ключ в хэше конфигурации:
ActiveRecord::Base.establish_connection(:production)
Исключения AdapterNotSpecified, AdapterNotFound и ArgumentError могут быть возвращены при ошибке.
# 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.