0

同じクエリをフラグメントキャッシュする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
4

2 に答える 2

5

一意のキャッシュ キーを使用する必要があります。オブジェクトを単純に渡すと、そのオブジェクトの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)
于 2010-05-01T17:01:23.033 に答える
1

私はそれを考え出した。

まず、この戦略の要点は、レール内のインテリジェントキャッシュキーを利用することです。これにより、モデル名、ID、およびupdated_at属性に基づいて一意のキーが自動生成されます。

2つのモデルを参照するコンテンツがある場合はどうなりますか?この組み込みには規則があり、配列を使用するだけです。

- cache([@posts, @user]) do

そして、これは投稿キーにユーザーキーを追加するだけなので、どちらかが更新されると、キャッシュは自動的に期限切れになります。これと同じ規則を使用して、プレーンな文字列の形式でキーに追加情報を追加できます。これは、同じクエリを利用しているが異なるビューを必要とするフラグメントを区別するのに役立ち、上記の質問に対する答えです。

- cache([@posts, "lists"]) do

次に、他のページで使用します

- cache([@posts, "list_with_images"]) do

これにより、互いに混同されない2つの別個のフラグメントが作成されます。

于 2010-05-01T16:46:42.413 に答える