Spec-Zone.ru › Ruby on Rails 6.0

модуль ActiveRecord::ConnectionHandling

Константы

DEFAULT_ENV
RAILS_ENV

Атрибуты

connection_specification_name[W]

Публичные методы экземпляров

clear_query_caches_for_current_thread() Показать исходный код
# 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

Очищает кэш запросов для всех подключений, связанных с текущей нитью.

connected?() Показать исходный код
# File activerecord/lib/active_record/connection_handling.rb, line 235
def connected?
  connection_handler.connected?(connection_specification_name)
end

Возвращает true , если Active Record подключен.

connected_to(database: nil, role: nil, &blk) Показать исходный код
# 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

При использовании ключа базы данных новое подключение будет устанавливаться каждый раз.

connected_to?(role:) Показать исходный код
# 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
connection() Показать исходный код
# File activerecord/lib/active_record/connection_handling.rb, line 198
def connection
  retrieve_connection
end

Возвращает подключение, в настоящее время связанное с классом. Это также может быть использовано для «одолжения» подключения для выполнения работы с базой данных, не связанной ни с одним из конкретных Active Records.

connection_config() Показать исходный код
# 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"}

Используйте только для чтения.

connection_pool() Показать исходный код
# File activerecord/lib/active_record/connection_handling.rb, line 226
def connection_pool
  connection_handler.retrieve_connection_pool(connection_specification_name) || raise(ConnectionNotEstablished)
end
connection_specification_name() Показать исходный код
# 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

Возвращает имя спецификации подключения из текущего класса или его родителя.

connects_to(database: {}) Показать исходный код
# 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

Возвращает массив установленных подключений.

current_role() Показать исходный код
# 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
establish_connection(config_or_env = nil) Показать исходный код
# 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 могут быть возвращены при ошибке.

remove_connection(name = nil) Показать исходный код
# 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
retrieve_connection() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API