Module: ActiveRecordStringEnum

Defined in:
lib/rails_string_enum/active_record_string_enum.rb

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’, scopes: { pluralize: true }



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
38
39
40
41
42
43
# File 'lib/rails_string_enum/active_record_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|
    # Product::RED #=> "red"
    const_set value.to_s.upcase, value.to_s

    # def red?() color == 'red' end
    klass.send(:detect_enum_conflict!, name, "#{value}?")
    klass.class_eval "      def \#{value}?\n        \#{name} == \#{value.to_s.upcase}\n      end\n    METHOD\n\n    # def red!() update! color: :red end\n    klass.send(:detect_enum_conflict!, name, \"\#{value}!\")\n    define_method(\"\#{value}!\") { update! name => value }\n\n    if scopes\n      # scope :only_red, -> { where color: 'red' }\n      # scope :only_reds, -> { where color: 'red' } # if scopes: { pluralize: true }\n      scope_name = scopes.try(:fetch, :pluralize, nil) ? \"only_\#{value.to_s.pluralize}\" : \"only_\#{value}\"\n      klass.send(:detect_enum_conflict!, name, scope_name, true)\n      klass.scope scope_name, -> { klass.where name => value }\n    end\n  end\n\n  define_attr_i18n_method(self, name, i18n_scope)\n  define_collection_i18n_method(self, name, i18n_scope)\n  define_collection_i18n_method_for_value(self, name, i18n_scope)\nend\n", __FILE__, __LINE__