Rails片段缓存“expires_in”值总是重新计算

时间:2014-02-28 15:02:55

标签: ruby-on-rails caching fragment cache-expiration

有没有人知道为什么每次读取缓存片段时rails似乎都会重新计算“expires_in”的值?

实施例

cache("usecase_#{usecase.id}", :expires_in => "#{usecase.minutesToNextRun}".to_i.minutes) do
    some code
end

如果我检查日志,我会看到每次读取缓存片段时调用usecase.minutesToNextRun方法(这非常昂贵并且会降低应用程序速度)。

理论

通常情况下,我希望rails只计算一次:expires_in值,然后将此值(例如5分钟)与当前时间(伪代码)进行比较。

if time_the_fragment_was_stored + expires_in > now
    do nothing
else
    re-render fragment
end

问题

有没有人有任何提示/想法如何防止每次读取片段时rails重新计算到期时间?

1 个答案:

答案 0 :(得分:0)

在此部分代码之前(或在您的控制器或演示者中):

cache("usecase_#{usecase.id}", :expires_in => "#{usecase.minutesToNextRun}".to_i.minutes) do
  some code
end

试试这个:

@minutes_to_next_run ||= usecase.minutesToNextRun

在上面的示例中,如果@minutes_to_next_runnil,则将其设置为usecase.minutesToNextRun。如果它有值,则使用它。如果你在语义上阅读它,那就有意义了:

  

@minutes_to_next_run或@minutes_to_next_run = usecase.minutesToNextRun

here是关于此

的(非常)确定的答案