Helper方法总是返回nil

时间:2014-01-04 19:47:25

标签: ruby-on-rails caching

我正在尝试为每个用户提供缓存结果,如下所示:

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。有什么问题?

2 个答案:

答案 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