提问人:croceldon 提问时间:11/14/2023 更新时间:11/15/2023 访问量:87
如何在类方法中使用低级 Rails 缓存?
How to use low-level Rails caching in a class method?
问:
有人可以向我解释为什么这种缓存尝试不起作用吗?
# in an ActiveRecord model....
def self.label(da_code)
Rails.cache.fetch [:option, :label, da_code, I18n.locale], expires_in: 3.hours do
option = Option.i18n.find_by(code: da_code)
return option.title if option
da_code
end
end
我在这里使用移动性进行翻译。在我看来,一旦加载,这根本不应该击中数据库。但它总是命中数据库,就好像缓存根本没有被使用一样。我已经在开发模式下启用了缓存,并且我已经验证了它在我的应用程序的其他地方是否有效。
我在这里错过了什么?
答:
1赞
dbugger
11/15/2023
#1
返回值干扰了缓存的设置。
尝试。。。
def self.label(da_code)
title = nil
Rails.cache.fetch [:option, :label, da_code, I18n.locale], expires_in: 3.hours do
option = Option.i18n.find_by(code: da_code)
title = option&.title
end
title.present? ? title : da_code
end
评论
def self.label(code); Rails.cache.fetch([:option, code]) { puts "CACHE miss" }; end
Model.label(:whatever) #=> CACHE miss
Model.label(:wathever)
Rails.application.config.cache_store
return option.title if option
option&.title
return
next
next option.title if option