2

如何在 Rails 3.2.3 中激活记录缓存

库存控制器.rb:

def index
  @stocks = Rails.cache.read custom_cache_path(@res.uuid, Const::ACTIVE_STOCKS)
  if @stocks.blank?
    @stocks = Stock.only_active_stocks(params[:restaurant_id])
    Rails.cache.write custom_cache_path(@res.uuid, Const::ACTIVE_STOCKS), @stocks
  end
end

def show
  @stocks = Rails.cache.read custom_cache_path(@res.uuid, Const::ACTIVE_STOCKS)
  if @stocks.blank?
    @stocks = Stock.only_active_stocks(params[:restaurant_id])
    Rails.cache.write custom_cache_path(@res.uuid, Const::ACTIVE_STOCKS), @stocks
  end
end

对显示操作缓存的请求何时返回 nil?

4

2 回答 2

3

在这里很难理解您在控制器中的意图,因为您的 show 和 index 方法具有相同的实现。

话虽如此,您可能希望将任何缓存逻辑移动到此处的模型中,这样就更容易隔离您的问题。

请考虑以下重构:

库存控制器:

def index
  @stocks = Stock.active_for_restaurant(params[:restaurant_id])
end

def show
  @stock = Stock.fetch_from_cache(params[:id])
end

股票.rb:

def active_for_restaurant(restaurant_id)
  Rails.cache.fetch(custom_cache_path(restaurant_id, Const::ACTIVE_STOCKS)) do
    Stock.only_active_stocks(restaurant_id)
  end
end

def fetch_from_cache(id)
  Rails.cache.fetch(id, find(id))
end

有关获取的更多信息,请参见: http ://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch

于 2012-05-22T13:42:22.127 回答
0

正如 rails api 所说 - 如果缓存中没有这样的数据(缓存未命中),则将返回 nil。那是你的问题吗?

顺便说一句,请确保在“active_stocks”更改时更新缓存。

于 2012-05-23T23:49:23.283 回答