Module: RailsStringEnum

Defined in:
lib/rails_string_enum/version.rb,
lib/rails_string_enum/string_enum.rb

Constant Summary collapse

VERSION =
"0.2.0"

Instance Method Summary collapse

Instance Method Details

#string_enum(name, enums, scopes: false, i18n_scope: nil) ⇒ Object

product.rb string_enum :color, %w(red green yellow) page.rb string_enum :background, %w(red green), i18n_scope: ‘product.color’



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
33
34
35
36
37
# File 'lib/rails_string_enum/string_enum.rb', line 8

def string_enum(name, enums, scopes: false, i18n_scope: nil)
  # create constant with all values
  # Product::COLORS # => ["red", "green", "yellow"]
  const_name_all_values = name.to_s.pluralize.upcase
  const_set const_name_all_values, enums.map(&:to_s)

  klass = self
  enums.each do |value|
    # def red?() color == 'red' end
    klass.send(:detect_enum_conflict!, name, "#{value}?")
    define_method("#{value}?") { self[name] == value }

    # def red!() update! color: :red end
    klass.send(:detect_enum_conflict!, name, "#{value}!")
    define_method("#{value}!") { update! name => value }

    if scopes
      # scope :red, -> { where color: 'red' }
      klass.send(:detect_enum_conflict!, name, value, true)
      klass.scope value, -> { klass.where name => value }
    end

    # Product::RED #=> "red"
    const_set value.to_s.upcase, value.to_s
  end

  define_attr_i18n_method(self, name, i18n_scope)
  define_collection_i18n_method(self, name, i18n_scope)
  define_collection_i18n_method_for_value(self, name, i18n_scope)
end