Module: ActiveRecordStringEnum
- Defined in:
- lib/rails_string_enum/active_record_string_enum.rb
Instance Method Summary collapse
-
#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 }.
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__ |