Rails.cache.fetch 在模型作为键给出时不起作用



我的印象是,我们可以给Rails一个模型(任何响应to_paramcache_key的模型)来Rails.cache.fetch,它会创建一个键并缓存块的响应。

我有这个代码:

class ResultsPresenter
def initialize(project)
@project = project
end
def results
results = Rails.cache.fetch("#{@project}/results") do
sleep 3
a = long_running_query
b = another_long_query
c = a + b
end
end
end

# called
project = Project.find(params[:project_id]_
presenter = ResultsPresenter.new(project)
presenter.results

@project已传递给ResultsPresenter,并且是 ActiveRecord 模型。当我指定"#{@project.to_param}/results""#{@project.cache_key}/results"时,一切正常。我还检查了@project是否正在更新,但事实并非如此。

有人知道为什么它不接受ActiveRecord模型吗?

您希望缓存键是一个数组,可能Rails.cache.fetch([@project, 'results']).

这将给出一个沿"project/5-20190812000000/results"行的缓存键。模型的格式与用/连接的其余数组值"model_name/model_id-updated_at"

如果您要查看从示例中生成的密钥,它看起来像"#<Project:0x007fbceaadbbc90>/results"。发生这种情况是因为您将@project.to_s的值烘焙到要传递到fetch的密钥的值中。

最新更新