'Singleton' на поток - PullRequest
       3

'Singleton' на поток

0 голосов
/ 12 февраля 2019

У меня есть вопрос о проблеме, с которой я столкнулся.Я пытаюсь реализовать объект (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, тогда все работает как положено ..

Я немного запутался, почему такое поведение должно происходить.Надеюсь, вы понимаете мой вопрос.

Спасибо!

1 Ответ

0 голосов
/ 13 февраля 2019

Rails, создает новый экземпляр контроллера по запросу, а не поток.Лучшее решение, которое я нашел, было: https://github.com/steveklabnik/request_store

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...