module Golden::EnumAccessor

Public Instance Methods

enum_accessor(*attributes, model:) click to toggle source
# File lib/golden/attribute_accessors/enum_accessor.rb, line 8
def enum_accessor(*attributes, model:)
  [*attributes].uniq.each do |attribute_name|
    plural_name = attribute_name.to_s.pluralize
    model = model.constantize unless model.is_a?(Class)

    attr_accessor attribute_name

    define_singleton_method(plural_name) do
      alias_name = "#{plural_name}_alias"
      values = model.send(plural_name).clone
      values.merge!(model.send(alias_name)) if model.respond_to?(alias_name)
      values
    end

    class_eval do
      define_method("#{attribute_name}=") do |value|
        enum_value = self.class.send(plural_name)[value]
        enum_key = model.send(plural_name).key(enum_value)
        instance_variable_set("@#{attribute_name}", enum_key)
      end
    end
  end
end