在 Rails 6 中更新基础模型时如何使 Action Cache 过期?

How to expire Action Cache when underlying model is updated in Rails 6?

我正在使用 Action Caching,它似乎适用于 Rails 6.

问题是当底层模型更新时如何使缓存过期?

根据Rails Guides

See the actionpack-action_caching gem. See DHH's key-based cache expiration overview for the newly-preferred method.

根据 Action Caching gem issue,使用 Rails 观察者清扫缓存是可行的。

https://github.com/rails/rails-observers#action-controller-sweeper

但是 Rails Observer 似乎不适用于 Rails 6.

那么,如何使用 after_save 回调使缓存过期?

您可以传入自己的 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 中的密钥失效,而是使用基于密钥的过期时间。