From e923174a2653ae57758a3a0cb1d3ffe641fc19b6 Mon Sep 17 00:00:00 2001 From: twinturbo Date: Wed, 11 Jul 2012 15:51:25 +0200 Subject: [PATCH] #cache_key delegates to #object by default --- lib/active_model/serializer.rb | 16 +++++++++++++--- test/caching_test.rb | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 332a7f3e..8415a8d3 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -276,7 +276,7 @@ module ActiveModel def to_json(*args) if perform_caching? - cache.fetch expand_cache_key([self.class.to_s.underscore, object.cache_key, 'to-json']) do + cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do super end else @@ -305,7 +305,7 @@ module ActiveModel <<<<<<< HEAD ======= if perform_caching? - cache.fetch expand_cache_key([self.class.to_s.underscore, object.cache_key, 'serializable-hash']) do + cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'serializable-hash']) do _serializable_hash end else @@ -441,7 +441,17 @@ module ActiveModel end def perform_caching? - perform_caching && cache && object.respond_to?(:cache_key) + perform_caching && cache && cache_key + end + + # Override this method if you want to create a key based on associations + # Here's an example: your serializer has associations and the scope + # + # def cache_key + # [ object, scope, scope.comments ] + # end + def cache_key + object.try :cache_key end def expand_cache_key(*args) diff --git a/test/caching_test.rb b/test/caching_test.rb index 614c407d..5c31373f 100644 --- a/test/caching_test.rb +++ b/test/caching_test.rb @@ -94,4 +94,27 @@ class CachingTest < ActiveModel::TestCase :skills => ['ruby'], }.to_json, serializer.cache.read('serializer/Adam/to-json')) end + + def test_can_use_defined_cache_key + serializer = Class.new(ActiveModel::Serializer) do + cache true + attributes :name, :skills + + def self.to_s + 'serializer' + end + + def cache_key + 'custom-key' + end + end + + serializer.cache = NullStore.new + instance = serializer.new Programmer.new + + instance.to_json + + assert serializer.cache.read('serializer/custom-key/to-json') + assert serializer.cache.read('serializer/custom-key/serializable-hash') + end end