2

Rails 3.2.3でレコードキャッシュをアクティブにする方法

stocks_controller.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

show アクション キャッシュへの要求が 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 に答える