lib/rails-settings/settings.rb in rails-settings-cached-0.2.1 vs lib/rails-settings/settings.rb in rails-settings-cached-0.2.2
- old
+ new
@@ -1,112 +1,113 @@
module RailsSettings
class Settings < ActiveRecord::Base
-
- self.table_name = 'settings'
-
+
+ self.table_name = 'settings'
+ attr_accessible :var
+
class SettingNotFound < RuntimeError; end
-
+
cattr_accessor :defaults
@@defaults = {}.with_indifferent_access
-
+
# Support old plugin
if defined?(SettingsDefaults::DEFAULTS)
@@defaults = SettingsDefaults::DEFAULTS.with_indifferent_access
end
-
+
#get or set a variable with the variable as the called method
def self.method_missing(method, *args)
method_name = method.to_s
super(method, *args)
-
+
rescue NoMethodError
#set a value for a variable
if method_name =~ /=$/
var_name = method_name.gsub('=', '')
value = args.first
self[var_name] = value
-
+
#retrieve a value
else
self[method_name]
-
+
end
end
-
+
#destroy the specified settings record
def self.destroy(var_name)
var_name = var_name.to_s
if self[var_name]
object(var_name).destroy
true
else
raise SettingNotFound, "Setting variable \"#{var_name}\" not found"
end
end
-
+
#retrieve all settings as a hash (optionally starting with a given namespace)
def self.all(starting_with=nil)
options = starting_with ? { :conditions => "var LIKE '#{starting_with}%'"} : {}
vars = thing_scoped.find(:all, {:select => 'var, value'}.merge(options))
-
+
result = {}
vars.each do |record|
result[record.var] = record.value
end
result.with_indifferent_access
end
-
+
#get a setting value by [] notation
def self.[](var_name)
if var = object(var_name)
var.value
elsif @@defaults[var_name.to_s]
@@defaults[var_name.to_s]
else
nil
end
end
-
+
#set a setting value by [] notation
def self.[]=(var_name, value)
var_name = var_name.to_s
-
+
record = object(var_name) || thing_scoped.new(:var => var_name)
record.value = value
record.save!
-
+
value
end
-
+
def self.merge!(var_name, hash_value)
raise ArgumentError unless hash_value.is_a?(Hash)
-
+
old_value = self[var_name] || {}
raise TypeError, "Existing value is not a hash, can't merge!" unless old_value.is_a?(Hash)
-
+
new_value = old_value.merge(hash_value)
self[var_name] = new_value if new_value != old_value
-
+
new_value
end
-
+
def self.object(var_name)
thing_scoped.find_by_var(var_name.to_s)
end
-
+
#get the value field, YAML decoded
def value
YAML::load(self[:value])
end
-
+
#set the value field, YAML encoded
def value=(new_value)
self[:value] = new_value.to_yaml
end
-
+
def self.thing_scoped
self.scoped_by_thing_type_and_thing_id(nil, nil)
end
-
-
+
+
end
end