lib/defaults.rb in defaults-0.1.0 vs lib/defaults.rb in defaults-0.1.1
- old
+ new
@@ -14,30 +14,34 @@
def defaults(attrs)
raise ArgumentError, "Hash expected; #{attrs.class} given." unless attrs.kind_of?(Hash)
include InstanceMethods
- self.default_options = attrs
+ self.default_options ||= {}
+ self.default_options.merge!(attrs)
+
after_initialize :set_default_attributes
end
-
- def has_defaults(attrs)
- warn "[WARNING] Using has_defaults is now deprecated. Please use defaults instead."
- defaults(attrs)
- end
end
module InstanceMethods
def default_for(name)
- self.class.default_options[name.to_sym]
+ value = self.class.default_options[name.to_sym]
+ value = value.arity == 1 ? value.call(self) : value.call if value.respond_to?(:call)
+ value
end
private
def set_default_attributes
if new_record?
- self.class.default_options.each do |name, value|
- value = value.arity == 1 ? value.call(self) : value.call if value.respond_to?(:call)
- send("#{name}=", value) if send(name).blank?
+ self.class.default_options.keys.each do |name|
+ # First, retrieve default value set through database.
+ # Will use this value in order to detect if value should be set.
+ info = self.class.columns_hash[name.to_s]
+ database_default = info ? info.default : nil
+
+ value = read_attribute(name)
+ __send__ "#{name}=", default_for(name) if value.blank? || value == database_default
end
end
end
end
end