Кэширование фрагментов 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

вот (очень) окончательный ответ об этом

Другие вопросы по тегам