From 92b6d43150a5aaf77a9d58d4a9db99d79063d5ce Mon Sep 17 00:00:00 2001 From: Gregor Schmidt Date: Mon, 19 Dec 2011 16:53:32 +0100 Subject: [PATCH] [#780] using a changing cache key to avoid the need for explicit cache invalidation This should work on all cache stores, since only the basic cache operations fetch and delete are used. The methods clear_cache and check_cache can no longer be supported. To sweep the whole cache Rails.cache.clear may be used. To invalidate the Settings only, you may use Setting.first.try(:touch). --- app/models/setting.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/models/setting.rb b/app/models/setting.rb index 145ee5cc..c13d5988 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -97,13 +97,13 @@ class Setting < ActiveRecord::Base # Returns the value of the setting named name def self.[](name) - Marshal.load(Rails.cache.fetch("chiliproject/setting/#{name}") {Marshal.dump(find_or_default(name).value)}) + Marshal.load(Rails.cache.fetch(self.cache_key(name)) {Marshal.dump(find_or_default(name).value)}) end def self.[]=(name, v) setting = find_or_default(name) setting.value = (v ? v : "") - Rails.cache.delete "chiliproject/setting/#{name}" + Rails.cache.delete self.cache_key(name) setting.save setting.value end @@ -137,23 +137,19 @@ class Setting < ActiveRecord::Base Object.const_defined?(:OpenID) && self[:openid].to_i > 0 end - # Checks if settings have changed since the values were read - # and clears the cache hash if it's the case - # Called once per request + # Deprecation Warning: This method is no longer available. There is no + # replacement. def self.check_cache - settings_updated_on = Setting.maximum(:updated_on) - cache_cleared_on = Rails.cache.read('chiliproject/setting-cleared_on') - cache_cleared_on = cache_cleared_on ? Marshal.load(cache_cleared_on) : Time.now - if settings_updated_on && cache_cleared_on <= settings_updated_on - clear_cache - end + ActiveSupport::Deprecation.warn "The Setting.check_cache method is " + + "deprecated and will be removed in the future. There should be no " + + "replacement for this functionality needed." end # Clears all of the Setting caches def self.clear_cache - Rails.cache.delete_matched( /^chiliproject\/setting\/.+$/ ) - Rails.cache.write('chiliproject/setting-cleared_on', Marshal.dump(Time.now)) - logger.info 'Settings cache cleared.' if logger + ActiveSupport::Deprecation.warn "The Setting.clear_cache method is " + + "deprecated and will be removed in the future. There should be no " + + "replacement for this functionality needed." end private @@ -165,4 +161,8 @@ private setting = find_by_name(name) setting ||= new(:name => name, :value => @@available_settings[name]['default']) if @@available_settings.has_key? name end + + def self.cache_key(name) + "chiliproject/setting/#{Setting.maximum(:updated_on).to_i}/#{name}" + end end