У меня есть вопрос о проблеме, с которой я столкнулся.Я пытаюсь реализовать объект (singleton) / поток, но я столкнулся с поведением, которое я не ожидал.
Например, у нас есть следующий код
class Persistence
attr_accessor :data
def self.instance
Thread.current[:persistence_store] ||= Persistence.new
end
def self.clear
Thread.current[:persistence_store] = nil
end
def get_data(user_id = nil)
self.data ||= AnotherClass.get_advanced_data(user_id)
end
end
Давайте скажемприходит запрос, и у нас Persistence.instance.get_data(1)
в контроллере (таким образом, get_data выполняется один раз).
Затем мы снова делаем Persistence.instance.get_data
в модели, все работает, как ожидается, она загружает данные изпервоначальный запрос.
Но, скажем, через 5 минут пользователь делает тот же запрос.Я обнаружил, что значение, сохраненное в Persistence.instance.get_data(2)
, является значением из первого запроса пользователя.(Это на самом деле Persistence.instance.get_data(1)
).
Разве рельсы не создают новый поток при каждом запросе, что вышеупомянутый случай не должен возникать?
Единственное решение, которое я обнаружил, было добавить before_filterв контроллере приложения, который выполняет Persistence.clear
, тогда все работает как положено ..
Я немного запутался, почему такое поведение должно происходить.Надеюсь, вы понимаете мой вопрос.
Спасибо!