модуль 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 40 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 44 def instance Thread.current[@per_thread_registry_key] ||= new end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.