Module: ArrayEnum

Defined in:
lib/array_enum.rb,
lib/array_enum/version.rb

Defined Under Namespace

Classes: Railtie, SubsetValidator

Constant Summary collapse

VERSION =
"1.1.0"

Instance Method Summary collapse

Instance Method Details

#array_enum(definitions) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/array_enum.rb', line 11

def array_enum(definitions)
  definitions.each do |attr_name, mapping|
    attr_symbol = attr_name.to_sym
    mapping_hash = ActiveSupport::HashWithIndifferentAccess.new(mapping)

    define_singleton_method(attr_name.to_s.pluralize) do
      mapping_hash
    end

    define_singleton_method("with_#{attr_name}".to_sym) do |values|
      db_values = Array(values).map do |value|
        mapping_hash[value] || raise(ArgumentError, MISSING_VALUE_MESSAGE % {value: value, attr: attr_name})
      end
      where("#{attr_name} @> ARRAY[:db_values]", db_values: db_values)
    end

    define_method(attr_symbol) do
      Array(self[attr_symbol]).map { |value| mapping_hash.key(value) }
    end

    define_method("#{attr_name}=".to_sym) do |values|
      self[attr_symbol] = Array(values).map do |value|
        mapping_hash[value] || raise(ArgumentError, MISSING_VALUE_MESSAGE % {value: value, attr: attr_name})
      end.uniq
    end
  end
end