модуль ActiveSupport::PerThreadRegistry
Этот модуль используется для инкапсуляции доступа к переменным, локальным для потока.
Вместо загрязнения пространства имён потоковых локалей:
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 35 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 39 def instance Thread.current[@per_thread_registry_key] ||= new end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.