Module: SqlEnum::ClassMethods

Defined in:
lib/sql_enum/class_methods.rb

Instance Method Summary collapse

Instance Method Details

#sql_enum(column_name, options = {}) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/sql_enum/class_methods.rb', line 3

def sql_enum(column_name, options = {})
  # Query values
  enum_column = EnumColumn.new(table_name, column_name)
  values_map = enum_column.values.to_h { |value| [value.to_sym, value.to_s] }

  # Check option defaults
  prefix = options.fetch(:_prefix, !!SqlEnum.configuration&.default_prefix)
  suffix = options.fetch(:_suffix, !!SqlEnum.configuration&.default_suffix)

  # Define enum using Rails enum
  enum(column_name => values_map, _prefix: prefix, _suffix: suffix)

  # Override reader to return symbols
  type_definition = ->(subtype) { EnumType.new(attr, send(column_name.to_s.pluralize), subtype) }
  case method(:decorate_attribute_type).arity
  when 2 # Rails 5.1, 5.2, 6.0
    decorate_attribute_type(column_name, :enum, &type_definition)
  else
    decorate_attribute_type(column_name, &type_definition)
  end

  prefix_str = format_affix(column_name, prefix, suffix: '_')
  suffix_str = format_affix(column_name, suffix, prefix: '_')

  # Fix query methods to compare symbols to symbols
  values_map.each_value do |value|
    method_name = "#{prefix_str}#{value}#{suffix_str}"
    define_method("#{method_name}?") { self[column_name] == value.to_sym }
  end
end