Сложное или глубокое хранение объектов в сеансе Ramaze сломано?
(это касается фреймворка Ramaze.net)
Я столкнулся с некоторыми действительно странными проблемами при хранении пользовательских объектов в сеансе. Я заметил, что обновляются только атрибуты объектов, сохраненных в сеансе. Однако, если эти объекты содержали ссылки на другие объекты, эти ссылочные объекты не обновлялись, если непосредственные объекты, содержащиеся в сеансе, не изменялись во время запроса.
Эта проблема стала очевидной только для меня, когда я использовал Ramaze::FileCache в качестве моего механизма кэширования сеанса. Я считаю, что проблема маскируется или не является проблемой при использовании сеансов в памяти.
Я обнаружил, что проблема заключается в "мелкой копии" в логике сеанса, найденной в Ramaze::Session::Hash#method_missing (lib/ramaze/current/session/hash.rb).
В качестве быстрого теста, чтобы убедиться, что мое мышление было правильным, я прокомментировал "проверку различий", по сути, заставляя сеанс обновляться каждый раз.
def method_missing(*args, &block)
old = @hash.dup
result = @hash.send(*args, &block)
#unless old == @hash
Cache.sessions[@session.session_id] = self
#end
result
end
Этот маленький хак исправил мою проблему. Теперь мои вопросы:
- это безопасное и разумное решение?
- Должен ли я просто избегать хранения сложных / глубоких объектов в сессии?
- Я что-то упускаю?
1 ответ
Эта проблема была решена в последней версии Ramaze (2009.04), пожалуйста, подайте исправление на трекер проблем Ramaze, если проблема сохраняется.