Sha256: 1d16cad8c43a02ef172b5560cb18c0207c2bd7104f46dab0fd6adb9742c5dd12

Contents?: true

Size: 1.69 KB

Versions: 1

Compression:

Stored size: 1.69 KB

Contents

require "active_support/concern"

# Adds methods to Rails Models
# swifter_enum
# model.enum_attribute (getter/setter)
# model.enum_attribute_raw (getter/setter to underlying enum)
# model.enum_attribute_raws

module SwifterEnum
  extend ActiveSupport::Concern

  class_methods do
    def swifter_enum(enum_name, enum_klass, enum_options = {})
      # Define the enum using values from the enum class
      enum(enum_name, enum_klass.values, **enum_options)

      # Define getter method
      define_method(enum_name) do
        attribute = read_attribute(enum_name)
        enum_klass.new(attribute) if attribute.present?
      end

      # Define setter method
      define_method(:"#{enum_name}=") do |new_value|
        if new_value.is_a?(enum_klass)
          super(new_value.value)
        else
          super(new_value)
        end
      end

      # Raw setter/getter allow escape valve for e.g. administrate
      # So, if your swifter_enum is
      # swifter_enum :camera, CameraKind
      # you can get and set camera_raw with standard enum values
      # and you can get the mapping with YourClass.camera_raws
      # This allows you to use andminstrate as an example on camera_raw and expect form selects to work normally.

      # Define raw getter method
      define_method(:"#{enum_name}_raw") do
        read_attribute(enum_name)
      end

      # Define raw setter method
      define_method(:"#{enum_name}_raw=") do |new_value|
        write_attribute(enum_name, new_value)
      end

      # Define class method to fetch the keys
      # Rails returns string keys, so copy that
      define_singleton_method(:"#{enum_name}_raws") do
        enum_klass.values.transform_keys(&:to_s)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
swifter_enum-0.9.6 lib/swifter_enum/swifter_enum.rb