Кэширование фрагментов Rails, значение "expires_in" всегда пересчитывается
Кто-нибудь знает, почему rails, кажется, пересчитывает значение "expires_in" каждый раз, когда читается кэшированный фрагмент?
ПРИМЕР
cache("usecase_#{usecase.id}", :expires_in => "#{usecase.minutesToNextRun}".to_i.minutes) do
some code
end
Если я проверю логи, то вижу, что usecase.minutesToNextRun
Метод вызывается каждый раз, когда читается фрагмент кэша (что довольно дорого и замедляет работу приложения).
ТЕОРИЯ
Обычно я ожидаю, что рельсы просто рассчитать :expires_in
значение один раз, а затем просто сравните это значение (например, 5 минут) с текущим временем (в псевдокоде).
if time_the_fragment_was_stored + expires_in > now
do nothing
else
re-render fragment
end
ВОПРОС
У кого-нибудь есть подсказка / идея, как я могу предотвратить пересчет рельсов времени истечения при каждом чтении фрагмента?
1 ответ
Перед этой частью кода (или в вашем контроллере или докладчике):
cache("usecase_#{usecase.id}", :expires_in => "#{usecase.minutesToNextRun}".to_i.minutes) do
some code
end
попробуй это:
@minutes_to_next_run ||= usecase.minutesToNextRun
в приведенном выше примере, если @minutes_to_next_run
является nil
тогда оно устанавливается равным usecase.minutesToNextRun
, Если оно имеет значение, оно использует его. Если вы читаете это в общих чертах, это имеет смысл:
@minutes_to_next_run ИЛИ @minutes_to_next_run = usecase.minutesToNextRun
вот (очень) окончательный ответ об этом