Sha256: 3edd0c7a5a9998c3bae9445c7eb071d011d372092450aa53bf938295236e2579

Contents?: true

Size: 1.36 KB

Versions: 1

Compression:

Stored size: 1.36 KB

Contents

module ActiveRecord
  module Enumerations
    def self.included(base)
      base.send :extend, ClassMethods
    end
  
    module ClassMethods
      include ActiveRecord::Enumerations::OptionsHelper
      
      def enum field_name, *config, &block
        field = EnumField.new field_name
        enum_class = Class.new Enum
        const_set field.name.camelize, enum_class
        add_options config, :enum_class => enum_class, :on_style_not_matched => asume_external_style(field)
        enums = Factory.new.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| field.external_class(options).all }
      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, ActiveRecord::Enumerations

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ar-enums-0.3.1 lib/enum_definition.rb