在 Rails 6 中更新底层模型时如何使动作缓存过期?
Posted
技术标签:
【中文标题】在 Rails 6 中更新底层模型时如何使动作缓存过期?【英文标题】:How to expire Action Cache when underlying model is updated in Rails 6? 【发布时间】:2021-05-29 09:46:00 【问题描述】:我正在使用动作缓存,它似乎可以与 Rails 6 一起使用。
问题是如何在底层模型更新时使缓存过期?
根据Rails Guides
查看 actionpack-action_caching gem。有关新的首选方法,请参阅 DHH 的基于键的缓存过期概述。
根据Action Caching gem issue,使用Rails Observer 来扫描缓存是可行的。
https://github.com/rails/rails-observers#action-controller-sweeper
但Rails Observer 似乎不适用于 Rails 6。
那么,如何通过after_save
回调使缓存过期?
【问题讨论】:
【参考方案1】:您可以传入自己的 cache_path 以使密钥过期。不过,您仍然需要获取一些记录来计算它。
class MyController < ApplicationController
before_action :set_record
caches_action :show, expires_in: 1.hour, cache_path: ->(_) show_cache_key
def show; end
private
def set_record
@record = Record.find(params[:id])
end
def show_cache_key
@record.cache_key
end
end
Doing cache invalidation by hand is an incredibly frustrating and error-prone process 所以我会避免使after_step
中的密钥失效,而是使用基于密钥的过期时间。
【讨论】:
谢谢。@record.cache_key
很有帮助。
完美运行。使用puts Rails.cache.instance_variable_get(:@data).keys
看看发生了什么。
只需使用cache_path: -> @record.cache_key
而不是cache_path: ->(_) show_cache_key
。在这种情况下,您不需要方法 show_cache_key
以上是关于在 Rails 6 中更新底层模型时如何使动作缓存过期?的主要内容,如果未能解决你的问题,请参考以下文章