Кеш фрагментов не о...
 
Уведомления
Очистить всё

Кеш фрагментов не обновляется, когда меняю позицию в заказе

2 Сообщения
2 Пользователи
1 Реакции
384 Просмотры
slava52
Сообщения: 9
Автор темы
Разобрался с блоками middle-разработчик
Присоединился: 2 года назад
[#76]

Rails 8.0, Solid Cache. В карточке заказа кеширую список позиций:

<% cache order do %>
  <% order.items.each do |item| %>
    <%= render item %>
  <% end %>
<% end %>

Если поменять количество в позиции, на странице остаётся старое значение, пока не отредактируешь сам заказ. Пришёл из C#, там кеш сбрасывал руками, тут вроде должно само. Где ошибка?


1 ответ
TimurK62
Сообщения: 31
Читает чужие PR бэкенд-разработчик
Присоединился: 3 года назад

Ключ кеша строится из order.cache_key_with_version, а версия это updated_at заказа. Позиция обновилась, заказ нет, ключ тот же, отдаётся старый фрагмент. Проще всего, чтобы позиция трогала заказ при изменении:

class Item < ApplicationRecord
  belongs_to :order, touch: true
end

Теперь каждое сохранение позиции обновляет updated_at заказа, ключ меняется, фрагмент пересобирается. И раз уж кешируешь, кешируй каждую позицию отдельно: render partial: "items/item", collection: order.items, cached: true. Тогда при изменении одной позиции пересобирается одна, а остальные читаются из кеша одним запросом. Мерил на заказе из 60 позиций: без кеша 180 мс на рендер, с кешем коллекции 25 мс, сразу после правки одной позиции около 30. Цена touch: true это лишний UPDATE заказа на каждое изменение позиции, при массовом импорте заметно, там оборачивай в ActiveRecord::Base.no_touching.


Ответ