Class: DataMapper::Types::Discriminator
- Inherits:
-
DataMapper::Type
- Object
- DataMapper::Type
- DataMapper::Types::Discriminator
- Defined in:
- lib/dm-core/types/discriminator.rb
Constant Summary
Constants inherited from DataMapper::Type
DataMapper::Type::PROPERTY_OPTIONS
Class Method Summary collapse
- .bind(property) ⇒ Object private
Methods inherited from DataMapper::Type
configure, dump, inherited, load, nullable, options, primitive
Class Method Details
.bind(property) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/dm-core/types/discriminator.rb', line 11 def self.bind(property) repository_name = property.repository_name model = property.model property_name = property.name model.default_scope(repository_name).update(property_name => model.descendants.dup << model) model.class_eval <<-RUBY, __FILE__, __LINE__ + 1 extend Chainable extendable do def inherited(model) super # setup self.descendants set_discriminator_scope_for(model) end def new(*args, &block) if args.size == 1 && args.first.kind_of?(Hash) discriminator = properties(repository_name).discriminator model = discriminator.typecast(args.first[discriminator.name]) if model.kind_of?(Model) && !model.equal?(self) return model.new(*args, &block) end end super end private def set_discriminator_scope_for(model) model.default_scope(#{repository_name.inspect}).update(#{property_name.inspect} => model.descendants.dup << model) end end RUBY end |