Sha256: eb2970caacf9042f0b229556da4939bb506649c110a6c3059a76b9ee5ad6e020

Contents?: true

Size: 1.34 KB

Versions: 3

Compression:

Stored size: 1.34 KB

Contents

module ArEnums
  module EnumDefinition
    def self.included(base)
      base.send :extend, ClassMethods
    end
  
    module ClassMethods
      include ArEnums::OptionsHelper
      
      def enum field_name, *config, &block
        field = EnumField.new field_name
        add_option config, field: field, active_record: self
        enums = Factory.make_enums *config, &block
        define_enums_getter field, enums
        define_enum_getter_and_setter field, enums      
      end
    
      private
      
      def asume_external_style field
        lambda { |options| external_class(field, options).all }
      end
      
      def external_class field, options = {}
        compute_type options.delete(:class_name) || field.name.camelize
      end
    
      def define_enums_getter field, enums
        meta_def(field.enums_getter) { enums }
      end
    
      def define_enum_getter_and_setter field, enums
        define_method field.name do
          enums.detect { |enum| enum.id == read_attribute(field.foreign_key) }    
        end                                                                       
      
        define_method "#{field.name}=" do |value|
          write_attribute field.foreign_key, enums.detect { |enum| enum == value }.try(:id)
        end
      end
    end
  end
end

ActiveRecord::Base.send :include, ArEnums::EnumDefinition

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ar-enums-2.0.2 lib/ar_enums/enum_definition.rb
ar-enums-2.0.1 lib/ar_enums/enum_definition.rb
ar-enums-2.0.0 lib/ar_enums/enum_definition.rb