【发布时间】:2019-06-07 21:28:18
【问题描述】:
我已经使用缓存很长时间了,最近发现我的片段缓存并没有像往常一样阻止我的控制器执行代码。我已将问题归结为与似乎是新功能的 cache_key 有关?
这是我以前的解决方案,不再按预期工作。
产品#Show-view:
cache('product-' + @product.id.to_s) do
# View stuff
end
Product#Show-controller:
unless fragment_exist?('product-19834') # ID obviously dynamically loaded
# Perform slow calculations
end
缓存工作正常。它写入和读取片段,但它仍然执行控制器(这是我想使用缓存的全部原因)。这归结为片段具有添加的唯一 id,因此创建的片段类似于:
views/product-19834/b05c4ed1bdb428f73b2c73203769b40f
所以当我检查 fragment_exist 是否存在时,我没有检查正确的字符串(因为我正在检查“views/product-19834”)。我也试过用:
fragment_exist?("product-#{@product.id}/#{@product.cache_key}")
但它检查的 cache_key 与实际创建的不同。
我宁愿使用这种解决方案,也不愿使用控制器缓存或联锁之类的宝石。
我的问题是: - 考虑到这个缓存键,我如何在控制器中检查特定视图的片段是否存在?
【问题讨论】:
-
你使用过动作缓存吗?
-
我已经尝试过一段时间,但结果证明不会在其他地方引起问题,我非常需要使用这个解决方案。感觉它不应该开箱即用,对吧?
-
cache_key 附加的视图哈希字符串是视图模板的 MD5 哈希。不幸的是,这将很难从您的控制器访问。我建议重构你的控制器逻辑以避免依赖于现有视图片段缓存的结果的耗时逻辑。例如,您可以通过模型缓存控制器中耗时的方法来解决此问题。如果这不可能,一个快速的解决方法可能是在生成 cache_key 时使用猴子补丁 rails 停止添加 MD5 哈希:stackoverflow.com/a/25839145/3448554
-
谢谢,Kelseydh。该链接中的解决方案(skip_digest => true)运行良好!如果你愿意,你可以把它作为答案。
标签: ruby-on-rails caching