[#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).
This commit is contained in:
parent
1ebec832af
commit
92b6d43150
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user