Last active
August 29, 2015 13:56
-
-
Save tsnow/9278975 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## New | |
class SystemConfig < ActiveRecord::Base | |
validates_uniqueness_of :name, :case_sensitive => :db | |
def self.cache | |
@cache ||= CachedMethod.new('system_config', :expires_in => 10.minutes) do | |
all | |
end | |
end | |
def self.fetch(name) | |
@cache.get.find{|i| i.name == name.to_s} | |
end | |
def self.fetch_value(name) | |
found = fetch(name) | |
return nil unless found | |
found.to_value | |
end | |
def self.fetch_value!(name) | |
err_msg = "SystemConfig.find_by_name(#{name.inspect}) doesn't exist" | |
raise ArgumentError.new(err_msg) unless found(name) | |
fetch_value(name) | |
end | |
def self.[](name) | |
fetch_value(name) | |
end | |
def self.[]=(name, value) | |
existing = SystemConfig.find(:first, :conditions => {:name => name}) | |
new_config = SystemConfig.new(:name => name, :value => value) | |
SystemConfig.transaction do | |
existing.delete if existing.present? | |
raise ActiveRecord::Rollback unless new_config.valid? | |
new_config.save | |
end | |
delete_cache | |
new_config.to_value | |
end | |
def self.method_missing(method, *args, &block) | |
return super unless has_key?(method.to_s) | |
fetch_value!(method.to_s) | |
end | |
def self.respond_to?(name) | |
super or fetch(name) | |
end | |
def self.delete_cache | |
cache.delete | |
end | |
def to_value | |
if name =~ /\?$/ | |
return (value == "0" || value == "false") ? false : true | |
end | |
case config.value | |
when /^\d*$/ then | |
value.to_i | |
when /^\d*\.\d*$/ then | |
value.to_f | |
else | |
value | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## Old | |
class SystemConfig < ActiveRecord::Base | |
SYSTEM_CONFIG_CACHE_KEY = 'system_config' | |
validates_uniqueness_of :name, :case_sensitive => :db | |
def self.[](name) | |
if system_config = Rails.cache.read(SYSTEM_CONFIG_CACHE_KEY) | |
return system_config[name] | |
else | |
cache_system_config[name] | |
end | |
end | |
def self.[]=(name, value) | |
existing = SystemConfig.find(:first, :conditions => {:name => name}) | |
new_config = SystemConfig.new(:name => name, :value => value) | |
SystemConfig.transaction do | |
existing.delete if existing.present? | |
raise ActiveRecord::Rollback unless new_config.valid? | |
new_config.save | |
end | |
delete_cache | |
end | |
def self.method_missing(method, *args, &block) | |
if !(value = SystemConfig.send(:[], method.to_s)).nil? | |
return value | |
elsif SystemConfig.respond_to? method.to_s | |
return | |
else | |
super | |
end | |
end | |
def self.respond_to?(name) | |
super or key_exists?(name) | |
end | |
def self.delete_cache | |
Rails.cache.delete(SYSTEM_CONFIG_CACHE_KEY) | |
end | |
private | |
def self.key_exists?(name) | |
if keys = Rails.cache.read(SYSTEM_CONFIG_CACHE_KEY).try(:keys) | |
return keys.any?{ |k| k == name} | |
end | |
return false | |
end | |
def self.cache_system_config | |
system_config = {} | |
SystemConfig.all.each do |config| | |
if config.name =~ /\?$/ | |
value = (config.value == "0" || config.value == "false") ? false : true | |
elsif config.value =~ /^\d*$/ | |
value = config.value.to_i | |
elsif config.value =~ /^\d*\.\d*$/ | |
value = config.value.to_f | |
else | |
value = config.value | |
end | |
system_config[config.name] = value | |
end | |
Rails.cache.write(SYSTEM_CONFIG_CACHE_KEY, system_config, :expires_in => 10.minutes) | |
system_config | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment