2016-07-17 12 views
0

私のアプリとPostgreSQLデータベースとの間のキャッシュ層としてredisを使用しようとしています。私はこれをやったことがないので、私と一緒に裸にしてください。Rails 4、redisモデルのキャッシュ、items_helperでfetch_itemsを呼び出すタイミングは?

、以下を参照してください私のルート、items_controller、items_helperファイルしてください。私はitems_helperの#fetch_itemsがどのように呼び出されるのか混乱しています。

現在、私は私のコントローラのアクションのすべてからJBuilderのテンプレートをレンダリングしています。私はこの機能を保持する必要があります。

module ItemsHelper 

    def fetch_items 
     byebug 
     items = $redis.get("items") 
     if items.nil? 
      items = Item.all.to_json 
      $redis.set("items", items) 
     end 
     @items = JSON.load items 
    end 

end 

答えて

1

items_helper

ルート

class ItemsController < ApplicationController 
    include ItemsHelper 
    # Returns full list of items 
    def index 
    @items = Item.all 
    end 

    # Returns details for a single item 
    def show 
    @item = Item.find(params[:id]) 
    end 
end 

items_controller.rb

Rails.application.routes.draw do 
    resources :users 
    resources :items 
    get 'users/:id/sold_items' => 'users#sold_items' 
    get 'categories/:id/available_items' => 'categories#available_items' 

    get 'performances/:view' => 'performances#show' 

をこのメソッドが自動的に呼び出されることになるだろうされていないため、手動でfetch_itemsを呼び出す必要があります。コードを考えると、私はあなたがfetch_itemsメソッドを使用する

@items = fetch_items 

@items = Item.all 

を置き換えることができることとします。

PS。あなたにも、コードの他の部分を調整する必要がある場合がありますので、fetch_items方法は、ハッシュの配列のみをItemオブジェクトの配列を返しません。

私は、この特定の状況でのRedisを使用すると、生産にそれを作る前に高速であるかどうかをベンチマークをお勧めします。

+0

素晴らしいアイデア – matthewalexander

0

私は、それ自体でのRedisの使用を開始する前に、レールガイド「caching with rails」を読んで推薦します。上記のコードは、すべての項目のキャッシュを維持し、最新の更新に更新滞在する

cachekey = "items/#{Item.maximum(:updated_at)}" 
@items = Rails.cache.fetch(cachekey, expires_in: 12.hours) do 
    Item.all.as_json 
end 

:あなたのような何かを行うことができます例えば

。あなたのアイテムのコレクションが巨大だが、検討する価値がある場合は、おそらくこれをしたくないだろう。私はそれを試してみましょう

関連する問題