0

example.com/communities?sort=popular の読み込み時にキャッシュを実装しようとしました

私のコードはこのようなものです。ただし、キャッシュが機能していないようです。
リロードするたびにSQLを送信しているようです...

どうしたの?次に、ユーザーが「Community」レコードを作成または編集した後、「community_index_sort_by_」という文字列を含むすべての保存されたキャッシュをクリアしたいと思います。

構成/環境/開発.rb

...
config.consider_all_requests_local       = true
config.action_controller.perform_caching = true
config.cache_store = :dalli_store
...

community_controller.rb

def index

    @key = "community_index_sort_by_" + params[:sort].to_s + "_page_" + params[:page].to_s

    if params[:sort] == 'popular'
        unless read_fragment(:controller => "communities", :action => "index",  :action_suffix => @key)
            @communities = Community.scoped.page(params[:page]).order("cached_votes_up DESC")
        end
    elsif params[:sort] == 'latest'
        @communities = Community.scoped.page(params[:page]).order("created_at DESC")
    end

end

目に触れていない

4

1 に答える 1

1

あなたが示したコードは、キャッシュからの読み取りを試みるだけで、何も保存しません。値が見つからない場合 (キャッシュ ミスなど) にキャッシュを設定する場合Rails.cache.fetchは、read_fragment. fetchキャッシュされた値が存在する場合は、それを返します。それ以外の場合、ブロックが渡された場合、キャッシュ ミスが発生したときにブロックが実行され、戻り値がキャッシュに格納されます。たとえば、コード スニペットの関連部分は次のようになります。

@communities = Rails.cache.fetch(["communities", "index", @key]) do
  Community.scoped.page(params[:page]).order("cached_votes_up DESC")
end

オブジェクトが変更されたときにキャッシュされたデータを期限切れにするための推奨される方法は、オブジェクトが変更されるたびに変更されるデータの一部をキャッシュ キーに含めることです。通常、これはupdated_atタイムスタンプ フィールドであり、オブジェクトが保存されると ActiveRecord が自動的に更新します。このupdated_atフィールドには、オブジェクトがキャッシュ キーの一部として直接使用される場合に、キャッシュ キーの一部として自動的に使用されるという利点もあります (たとえば、 のキャッシュ キー@communityは のようなキャッシュ キーになりますcommunities/1-20130116113736)。これには通常、関連するオブジェクトをキャッシュ キーで使用できるようにするために、少量の再構築が必要になります。David Heinemeier Hanssonがこれについて詳しく説明しています。特にステップ 5 は、ここで述べたことに最も関連しています。

于 2013-01-27T08:25:58.707 に答える