Вопрос кэширования фрагмента Memcached и Rails
-
02-10-2019 - |
Вопрос
Когда у меня есть 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
Решение
Вы должны использовать уникальный ключ кэширования. Если вы простой проходите в объекте, он называет 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 и AUPLIED_AT атрибутов.
Что, если у вас есть контент, который относится к двум моделям? Есть конвенция для этого встроенного, вы просто используете массив:
- cache([@posts, @user]) do
И это просто добавляет ключ пользователя к ключу постов, чтобы, если либо обновляется кеш автоматически истекает. Вы можете использовать эту же конвенцию, чтобы добавить дополнительную информацию в ключ в виде простой строки. Это полезно для различения фрагментов, которые рисуют на одном получении, но требуют разных представлений, и является ответом на вопрос выше.
- cache([@posts, "lists"]) do
а затем на другой странице пользуется
- cache([@posts, "list_with_images"]) do
И это создаст два отдельных фрагмента, которые не будут путать друг с другом.