Sha256: ef3ad78dc58362ad6d2a66a715be576ea3ed78769306588a589b233a7d37ec83

Contents?: true

Size: 1.85 KB

Versions: 15

Compression:

Stored size: 1.85 KB

Contents

require 'ardm/property/class'

module Ardm
  class Property
    class Discriminator < Class
      load_as   ::Class
      dump_as   ::String
      default   lambda { |resource, property| resource.class }
      required  true

      # ActiveRecord just stores the string name of the class.
      # We dump false for a bad value because it results in a
      # class that isn't in the "dump_as".
      #
      # Expects the class name to be a valid class name that is
      # loaded and available.
      def dump(value)
        dumped = typecast(value)
        dumped.name if dumped.is_a?(::Class)
      end

      def load(value)
        typecast(value)
      end

      # @api private
      def bind
        model.inheritance_column = field
        model.extend Model unless model < Model
      end

      module Model
        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.discriminator

            if discriminator_value = args.first[discriminator.name]
              model = discriminator.typecast(discriminator_value)

              if model.kind_of?(Model) && !model.equal?(self)
                return model.new(*args, &block)
              end
            end
          end

          super
        end

      private

        def set_discriminator_scope_for(model)
          discriminator = self.properties.discriminator
          model.scoped.with_default_scope.update_all(discriminator.field => model.descendants.dup << model)
        rescue ::ActiveRecord::ConnectionNotEstablished => e
          puts "Error was raised but it seems to be an ActiveRecord 3.2 error, fixed in 4:\n#{e}"
        end
      end
    end # class Discriminator
  end # class Property
end # module Ardm

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
ardm-0.4.0.ar427 lib/ardm/property/discriminator.rb
ardm-0.4.0 lib/ardm/property/discriminator.rb
ardm-0.3.2 lib/ardm/property/discriminator.rb
ardm-0.3.1 lib/ardm/property/discriminator.rb
ardm-0.3.0 lib/ardm/property/discriminator.rb
ardm-0.2.7 lib/ardm/property/discriminator.rb
ardm-0.2.6 lib/ardm/property/discriminator.rb
ardm-0.2.5 lib/ardm/property/discriminator.rb
ardm-0.2.4 lib/ardm/property/discriminator.rb
ardm-0.2.3 lib/ardm/property/discriminator.rb
ardm-0.2.2 lib/ardm/property/discriminator.rb
ardm-0.2.1 lib/ardm/property/discriminator.rb
ardm-0.2.0 lib/ardm/property/discriminator.rb
ardm-0.1.0 lib/ardm/property/discriminator.rb
ardm-0.0.1 lib/ardm/property/discriminator.rb