我的印象是,我们可以给Rails一个模型(任何响应to_param
或cache_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
的密钥的值中。