6

アプリでアクション キャッシングを設定しました (スイーパーを使用しますが、ここでは関係ないと思います)。

ページネーションに Kaminari を使用expire_actionしているため、アクションを実行すると、最初のページのみが期限切れになります。ページを指定するためにクエリ文字列を使用するとキャッシュが機能しないことがわかっているので、URL の末尾にページが追加されるようにルートを設定しました (たとえば、/people/123/page/2)。

必要に応じてこの投稿にさらに情報を追加しますが、ここに欠けている明らかな何かがあると思います。残りのページを期限切れにする方法を知っている人はいますか?

4

2 に答える 2

5

私はまだ元の質問への回答に興味があり、解決策が見つかった場合は受け入れた回答を変更します。そうは言っても、ページが指定されているかどうかを確認することで、元のページをキャッシュするだけで済みました。

caches_action:index、:if => Proc.new {params [:page] .nil?}

于 2012-05-20T06:28:16.453 に答える
1

これは私が考えた解決策で、まだ実装していませんが、同じ問題に直面しています。実際の有効期限を独自のキーにキャッシュします。キーは、検索 URL の標準的な表現になります。つまり、「ページ」パラメータはありません。例えば:

ユーザーはhttp://example.com?q=foo&page=3で検索するため、 params は{ q: 'foo', page: 3 }. "page=3" を取り除くと、{ q: 'foo' } が残ります。

それを実行to_paramしてプレフィックスを追加すると、 のようなキャッシュ キーが残りますsearch_expiry_q=foo

この正規クエリ、つまり Rails.cache.read( search_expiry_q=foo) のキャッシュを検索します。存在する場合は、この時点で結果を期限切れにします。残念ながら しかなく しかexpires_inないexpires_atので、計算する必要があります。つまり、次のようなものですexpires_in: expiry_time - Time.now - 5.seconds(5 秒で競合状態を防ぐことができれば幸いです)。この方法で完全な URL/パラメーターをキャッシュします。

OTOH 有効期限がない場合は、最近誰も検索を実行していません。そこで、次のようにします。

expiry_time = Time.now + 1.hour
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour)

そして、このフラグメント/ページを、再び完全な URL/パラメーターでキャッシュし、expires_in: 1.hour.

于 2012-08-14T18:30:32.053 に答える