Class: DataMapper::Types::Discriminator

Inherits:
DataMapper::Type show all
Defined in:
lib/dm-core/types/discriminator.rb

Constant Summary

Constants inherited from DataMapper::Type

DataMapper::Type::PROPERTY_OPTIONS

Class Method Summary collapse

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