Нет особой причины держаться подальше от локальных переменных потока, основные проблемы:
- их сложнее протестировать, так как вам придется помнить об установке локальных переменных потока при тестировании кода, который его использует
- классы, которые используют локальные потоки, должны знать, что эти объекты не доступны для них, но находятся внутри локальной переменной потока, и этот тип косвенного обращения обычно нарушает закон деметры
- не очистка локальных потоков может быть проблемой, если ваша среда повторно использует потоки (локальная переменная потока уже будет инициирована, и код, использующий || = вызовы для инициализации переменных, может завершиться ошибкой
Таким образом, хотя использовать его не является совершенно бесспорным, лучший подход заключается не в их использовании, а в том, что время от времени вы наталкиваетесь на стену, где локальный поток будет самым простым из возможных. решение без изменения большого количества кода, и вам придется идти на компромисс, иметь неидеальную объектно-ориентированную модель с локальным потоком или изменять довольно много кода, чтобы сделать то же самое.
Итак, это в основном вопрос мышления, которое будет лучшим решением для вашего случая, и если вы действительно идете по пути локального потока, я бы, конечно, посоветовал вам сделать это с блоками, которые помнят очистить после того, как они сделаны, как показано ниже:
around_filter :do_with_current_user
def do_with_current_user
Thread.current[:current_user] = self.current_user
begin
yield
ensure
Thread.current[:current_user] = nil
end
end
Это гарантирует, что локальная переменная потока очищается перед использованием, если этот поток перерабатывается.