модуль 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.