我正在尝试为每个用户提供缓存结果,如下所示:
def user_color(username)
cache_key = "Colors/#{username}"
color = Rails.cache.read(cache_key)
if nil?
if Group.where(:members => username).desc(:priority).first == nil
color = "none"
else
color = Group.where(:members => username).desc(:priority).first.html_color
end # Write back to the cache for the next time
Rails.cache.write(cache_key,color)
end
end
问题是,当我没有缓存结果时,它会在一个页面加载时查询DB 20次,但是使用缓存它总是返回nil。有什么问题?
答案 0 :(得分:0)
如果只是零,这一切都在分支?
如果没有?返回false,所以没有任何东西可以返回。
答案 1 :(得分:0)
使用Rails.cache.fetch
- http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch(也让它更漂亮;))
def user_color(username)
Rails.cache.fetch("Colors/#{username}") do
Group.where(:members => username).desc(:priority).first.try(:html_color) || 'none'
end
end
并考虑将此属性设为一个计算列,该列将在Group的before_save上更新,因此您不需要每次都查询或缓存它,
如果不这样做,请考虑将此方法提取到模型中,例如User#html_color