Comprehensive cache key generator for scopes (complements Rails' `cache` helper)
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
bin
gemfiles
lib
spec
.codeclimate.yml
.gitignore
.rspec
.rubocop.yml
.travis.yml
Appraisals
CODE_OF_CONDUCT.md
Gemfile
Gemfile.lock
LICENSE.txt
README.md
Rakefile
cache_key_for.gemspec

README.md

CacheKeyFor Gem Version Build Status Coverage Status Code Climate

Comprehensive cache key generator (complements Rails cache helper)

How to design a perfect cache key? This project's goal is to provide the bulletproof solution for most use cases.

Install

cache_key_for is a Railtie. We support the versions of Ruby and Rails listed in .travis.yml.

It should be run as a gem and included in your Gemfile:

gem "cache_key_for"

#cache_key_for

Features:

  • ORM agnostic

  • works with arrays and Plain Old Ruby Objects (POROs) (just provide: #id, #updated_at)

  • supports locale

  • recognizes subdomains

  • deletion from and addition to collections sorted in ascending order (via embedded count in the key)

  • accepts cache_owner_cache_key for personalized cache, eg. current_company.cache_key, current_user.cache_key etc.

  • filters params with proper non-utf8 data handling for key generation

  • supports paginated and not paginated collections or arrays of objects

  • recognizes pagination via params (performs well for less than 100 objects per page)

  • allows to set default page and per_page or sort order or any param in default_params to avoid multiple different default caches

  • includes all params, not only GET's query params, which enables submitting of complex forms via POST, which - otherwise - would have query string longer than 2048 characters (Microsoft Internet Explorer)

  • optional whitelist of first level parameters to prevent accidentally generating duplicated cache

  • strips utm_* params

  • optional suffix for:

    • expiry tags (unlike :expires_in cache option, this offers full :file_store storage compatibility)
    • any edge cases
  • file differentiation and file changes are handled separately by Rails' cache helper (md5 is added at the end of cache path)

  • one key instead of many, but also unobtrusive (example in haml):

    - cache [cache_key_for(@articles, 'articles'), @some_active_model_object, 'box-type-view'] do
    (...)
  • core concept of Russian Doll Caching is touching: belongs_to :some_model, touch: true, but if you do not use touch, you can still cache safely like this (example in haml):

    - cache [cache_key_for(@articles, 'articles'), @some_model_instance] do
    (...)

Example (haml):

- cache cache_key_for(@service.datacenters, 'datacenters', current_company.cache_key, Time.now.utc.to_date.to_s) do
(...)

Rails will generate cache at:

app_name:views/en/datacenters/5bd92bd352e7726d02175752913014711f5d412e/companies/1-20150619101645935901000/2015-06-26/7a6f89a738006a69c1d1e0214e147bab

#cache_key_for_view

Features:

  • all features of cache_key_for method
  • better debugging (accepts view/partial file path for visible part of cache key)

Example (haml):

- cache cache_key_for_view(__FILE__, @service.datacenters, 'datacenters', current_company.cache_key, Time.now.utc.to_date.to_s) do
(...)

Rails will generate cache at:

app_name:views/en/datacenters/5bd92bd352e7726d02175752913014711f5d412e/companies/1-20150619101645935901000/2015-06-
26/app/views/services/datacenters.html.haml/4324f99340fd2b2bc7e26b8e9b79d8f5

Contributing

./bin/setup
bundle exec rake

Testing new versions

rm gemfiles/*.lock
bundle exec appraisal install

Todo