Rails 8.0, Solid Cache. В карточке заказа кеширую список позиций:
<% cache order do %>
<% order.items.each do |item| %>
<%= render item %>
<% end %>
<% end %>
Если поменять количество в позиции, на странице остаётся старое значение, пока не отредактируешь сам заказ. Пришёл из C#, там кеш сбрасывал руками, тут вроде должно само. Где ошибка?
Ключ кеша строится из 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.