MemcachedおよびRails Fragmentキャッシングの問題
-
02-10-2019 - |
質問
フラグメントを同じクエリをキャッシュしますが、異なる方法で表示する2つのビューがある場合、フラグメントは1つだけで、どちらも同じ方法で表示されます。これを回避する方法はありますか?例えば...
#views/posts/list
- cache(@posts) do
- for p in @posts
= p.title
#views/posts/list_with_images
- cache(@posts) do
- for p in @posts
= p.title
= p.content
= image_tag(p.image_url)
#controllers/posts_controller
def list
...
@posts = Post.all
end
def list_with_images
...
@posts = Post.all
end
解決
一意のキャッシュキーを使用する必要があります。オブジェクトを単純に渡すと、 cache_key
キーを決定するための方法。オブジェクトの配列を渡すと、 cache
配列のすべての要素のキャッシュキーを結合することにより、キーを生成します。これを使用して問題を修正できます。
#views/posts/list
- cache([:list, @posts]) do
- for p in @posts
= p.title
#views/posts/list_with_images
- cache([:list_with_images, @posts]) do
- for p in @posts
= p.title
= p.content
= image_tag(p.image_url)
他のヒント
私はそれを考え出した。
まず、この戦略の全体的なポイントは、モデル名、ID、およびupdated_at属性に基づいて一意のキーを自動生成するRailsのインテリジェントキャッシュキーを利用することです。
2つのモデルを指すコンテンツがある場合はどうなりますか?この組み込みのコンベンションがあり、配列を使用するだけです。
- cache([@posts, @user]) do
そしてこれは、投稿キーにユーザーキーを追加するだけです。 また 更新されますキャッシュは自動的に有効です。この同じコンベンションを使用して、プレーンストリングの形でキーに追加情報を追加できます。これは、同じクエリを描くが異なるビューを必要とするフラグメントを区別するのに役立ち、上記の質問に対する答えです。
- cache([@posts, "lists"]) do
そして、他のページで使用します
- cache([@posts, "list_with_images"]) do
そして、これにより、互いに混同されない2つの別々のフラグメントが作成されます。
所属していません StackOverflow