Skip to content

Instantly share code, notes, and snippets.

@tsnow
Last active August 29, 2015 13:56
Show Gist options
  • Save tsnow/9278975 to your computer and use it in GitHub Desktop.
Save tsnow/9278975 to your computer and use it in GitHub Desktop.
## 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
## 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