GithubHelp home page GithubHelp logo

scope_cache_key's Introduction

Scope Cache Key

This gem adds the cache_key functionality to ActiveRecord scopes.

This is useful when caching a page that contains multiple records. It is now possible to cache the entire page based on a scope. If any record in the scope changes, the entire cache will be busted.

This should likely be used in a Russian Doll Caching scenario.

NOTE: This currently only works with Postgresql. Adding support for MySQL should be trivial.

Build Status

Installation

Add this line to your application's Gemfile:

gem 'scope_cache_key'

Usage

Example:

<%
scope = Article.page(1) # This should probably be done in your controller!
cache scope do
  # logic to render and cache each article here
end
%>

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

scope_cache_key's People

Contributors

cmer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

scope_cache_key's Issues

Duplicate column name 'id' when the scope already selects columns

If the scope already selects columns:

@items = Item.select('`items`.*')

Then calling the cache on the scope directly will raise an error:

cache [@items] do
  ...

The error:

Mysql2::Error: Duplicate column name 'id': SELECT CONCAT(`id`, '-', `updated_at`) FROM (SELECT  `items`.*, items.id, items.updated_at FROM ...

AR::Relation's with eager loading cache_key's

Came across this gem from a Rails issue and had a similar problem I was going to solve. Thought it might be useful to include the solution in this gem as well.

We know that using includes to eager load associations is a good way to avoid N+1 queries. And obviously using fragment caching is good as well but they don't place nicely together. When fragment caching a relation that includes associations, they will all get loaded in the query to determine the cache key. In my opinion, the included associations should be discarded in this case.

If you're interested in this feature I could give it a go.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.