在 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: -&gt; @record.cache_key 而不是cache_path: -&gt;(_) show_cache_key 。在这种情况下,您不需要方法 show_cache_key

以上是关于在 Rails 6 中更新底层模型时如何使动作缓存过期?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Rails 中更新动作文本富文本

如何在 Rails 中缓存模型对象?

Rails:旧数据与新数据不匹配时如何更新片段缓存

在 RAILS 中将模型从一个控制器动作传递到另一个控制器动作的替代方法

如何在Rails中使数据库字段为只读?

带有查询字符串参数的 Rails 动作缓存