Кэширование Memcached и фрагментов Rails - PullRequest
0 голосов
/ 01 мая 2010

Когда у меня есть 2 представления, которые кешируют фрагменты одного и того же запроса, НО отображают их по-разному, остается только один фрагмент, и оба они отображают его одинаково. Есть ли способ обойти это? Например ...

#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

Ответы [ 2 ]

5 голосов
/ 01 мая 2010

Вы должны использовать уникальный ключ кеша. Если вы просто передаете объект, он вызывает метод 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)
1 голос
/ 01 мая 2010

Я понял это.

Прежде всего, вся суть этой стратегии заключается в использовании интеллектуальных ключей кэша в рельсах, которые автоматически генерируют уникальные ключи на основе имени модели, идентификатора и атрибутов updated_at.

Что если у вас есть контент, который относится к двум моделям? Это встроенное соглашение, вы просто используете массив:

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

И это просто добавляет пользовательский ключ к ключу сообщений, так что если или обновляется, кеш автоматически истекает. Вы можете использовать это же соглашение для добавления дополнительной информации к ключу в виде простой строки. Это полезно для различения фрагментов, которые рисуются в одном и том же запросе, но требуют разных представлений, и является ответом на вопрос выше.

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

и затем на другой странице используйте

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

и это создаст два отдельных фрагмента, которые не будут путать друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...