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