модуль ActiveSupport::PerThreadRegistry
ПРИМЕЧАНИЕ: Этот подход устарел для кода конечного пользователя в пользу thread_mattr_accessor и других подобных методов. Пожалуйста, используйте этот подход вместо этого.
Этот модуль используется для инкапсуляции доступа к переменным потока.
Вместо того, чтобы засорять пространство имён локальных переменных потоков:
Thread.current[:connection_handler]
вы определяете класс, который расширяет этот модуль:
module ActiveRecord
class RuntimeRegistry
extend ActiveSupport::PerThreadRegistry
attr_accessor :connection_handler
end
end
и вызываете объявленные методы доступа к экземплярам как методы класса. Таким образом
ActiveRecord::RuntimeRegistry.connection_handler = connection_handler
устанавливает обработчик соединения, локальный для текущего потока, и
ActiveRecord::RuntimeRegistry.connection_handler
возвращает обработчик соединения, локальный для текущего потока.
Эта функция реализуется путём создания экземпляра класса и хранения экземпляра как локальной переменной потока с ключом, соответствующим имени класса. В примере выше ключ “ActiveRecord::RuntimeRegistry” хранится в Thread.current. Методы класса делегируют обращение к этому экземпляру локальной переменной потока.
Если у класса есть инициализатор, он должен принимать нулевые аргументы.
Публичные методы класса
# File activesupport/lib/active_support/per_thread_registry.rb, line 42 def self.extended(object) object.instance_variable_set "@per_thread_registry_key", object.name.freeze end
Публичные методы экземпляра
# File activesupport/lib/active_support/per_thread_registry.rb, line 46 def instance Thread.current[@per_thread_registry_key] ||= new end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.