I faced recently an issue in our app, regarding collection caching. I wrongly assumed that collections were invalidated when new entries were added to the collection. I am using the really helpful iterators variables available locally in the template to show information, on a carousel for instance:
# app/views/pictures/_picture.html.erb <% index = picture_iteration.index %> <% size = picture_iteration.size %> <li class="carousel-slide"> <img src="..." /> <span class="legend"><%= picture.name %> (<%= index + 1 %>/<%= size %>)</span> </li>
For performance, I am caching the collection
# app/views/pictures/index.html.erb <%= render partial: "public/venues/picture", collection: @venue.pictures, cached: true %>
If new pictures are added or, some are evicted from the cache, iterators become incoherent. Indeed, only non-cached entry will be taken into account in the size and index variables, and old entries will have wrong size values saved in the cached template .
I am proposing the following change available in this PR, allowing one to invalidate the collection cache when a new entry is added to the collection; when the
invalidate_cache_on_new_entry option is specified on the collection render call.
This is my first PR and feature proposal on Rails, let me know if you need more information / I can improve the problem statement.