lib/mongo_mapper/plugins/keys.rb in mongo_mapper-0.13.0.beta2 vs lib/mongo_mapper/plugins/keys.rb in mongo_mapper-0.13.0

- old
+ new

@@ -33,10 +33,28 @@ def unaliased_keys @unaliased_keys ||= Hash[*keys.select {|k, v| k == v.name }.flatten(1)] end + def dealias_keys(hash) + out = {} + hash.each do |k, v| + key = keys[k.to_s] + name = key && key.abbr || k + out[name] = k.to_s.match(/^\$/) && v.is_a?(Hash) ? dealias_keys(v) : v + end + out + end + + def dealias_key(name) + key = keys[name.to_s] + key && key.abbr || k + end + + alias_method :dealias, :dealias_keys + alias_method :unalias, :dealias_keys + def key(*args) Key.new(*args).tap do |key| keys[key.name] = key keys[key.abbr] = key if key.abbr create_accessors_for(key) if key.valid_ruby_name? @@ -45,12 +63,30 @@ create_validations_for(key) @dynamic_keys = @defined_keys = @unaliased_keys = @object_id_keys = nil end end + def remove_key(name) + if key = keys[name.to_s] + keys.delete key.name + keys.delete key.abbr + remove_method key.name if respond_to? "#{key.name}" + remove_method "#{key.name}=" if respond_to? "#{key.name}=" + remove_method "#{key.name}?" if respond_to? "#{key.name}?" + remove_method "#{key.name}_before_type_cast" if respond_to? "#{key.name}_before_type_cast" + remove_key_in_descendants key.name + remove_validations_for key.name + @dynamic_keys = @defined_keys = @unaliased_keys = @object_id_keys = nil + end + end + def persisted_name(name) - keys[name.to_s].persisted_name + if key = keys[name.to_s] + key.persisted_name + else + name + end end alias_method :abbr, :persisted_name def key?(key) keys.key? key.to_s @@ -147,10 +183,14 @@ def create_key_in_descendants(*args) descendants.each { |descendant| descendant.key(*args) } end + def remove_key_in_descendants(name) + descendants.each { |descendant| descendant.remove_key(name) } + end + def create_indexes_for(key) if key.options[:index] && !key.embeddable? warn "[DEPRECATION] :index option when defining key #{key.name.inspect} is deprecated. Put indexes in `db/indexes.rb`" ensure_index key.name end @@ -198,10 +238,18 @@ key.options[:length] end validates_length_of(attribute, length_options) end end + + def remove_validations_for(name) + name = name.to_sym + a_name = [name] + + _validators.reject!{ |key, _| key == name } + _validate_callbacks.reject! {|callback| callback.raw_filter.attributes == a_name } + end end def initialize(attrs={}) @_new = true init_ivars @@ -387,9 +435,10 @@ instance_variable_set key.ivar, as_typecast else @_dynamic_attributes[key.name.to_sym] = as_typecast end @attributes = nil + value end def dynamic_key(name) self.class.key(name, :__dynamic => true) end