Sha256: 27a98da793897c16343e649e45be2142f136eba6bdeb0fcbd2a4dbd168a7a89f

Contents?: true

Size: 1.31 KB

Versions: 4

Compression:

Stored size: 1.31 KB

Contents

module ActiveHash
  module Enum

    DuplicateEnumAccessor = Class.new(RuntimeError)

    def self.included(base)
      base.extend(Methods)
    end
    
    module Methods

      def enum_accessor(field_name)
        @enum_accessor = field_name
        reload
      end

      def insert(record)
        super
        set_constant(record) if @enum_accessor.present?
      end

      def delete_all
        if @enum_accessor.present?
          @records.each do |record|
            constant = constant_for(record.attributes[@enum_accessor])
            remove_const(constant) if const_defined?(constant)
          end
        end
        super
      end

      def set_constant(record)
        constant = constant_for(record.attributes[@enum_accessor])
        return nil if constant.blank?

        unless const_defined?(constant)
          const_set(constant, record)
        else
          raise DuplicateEnumAccessor, "#{constant} already defined for #{self.class}" unless const_get(constant) == record
        end
      end

      private :set_constant

      def constant_for(field_value)
        if constant = field_value.try(:dup)
          constant.gsub!(/[^A-Za-z]+/, "_")
          constant.gsub!(/^_|_$/, '')
          constant.upcase!
          constant
        end
      end

      private :constant_for
    end

  end

end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
active_hash-0.8.6 lib/enum/enum.rb
active_hash-0.8.5 lib/enum/enum.rb
active_hash-0.8.4 lib/enum/enum.rb
active_hash-0.8.3 lib/enum/enum.rb