Rendering collections in Rails, with custom cache parameters
This blog post was originally published a little while ago. Please consider that it may no longer be relevant or even accurate.
Rails has a simple syntax for rendering a collection of partials and caching them all in one go. Under the hood it'll try and fetch all the cached views at once, minimising unnecessary I/O.
This works well, but what happens if the partial cache depends on additional data? For example - if something was specific to the logged in user. Generally you'd instead handle this with the
cache helper in the partial instead.
Unfortunately this means you'll need to hit your cache store for each individual partial which is not as performant.
I've long looked for a way to solve this but couldn't find the solution. It didn't appear to be documented anywhere, until I stumbled across it in the
cache helper's source code.
You can actually pass a proc to the
cached argument and control the cache constraints from the top render` call!
Just like that you get the performance benefits of a single cache hit and don't need to dirty your partials with manual