Module: RailsStringEnum
- Defined in:
- lib/rails_string_enum/version.rb,
lib/rails_string_enum/string_enum.rb
Constant Summary collapse
- VERSION =
"0.1.0"
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’.
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 38 39 40 41 |
# 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) # create constant for each value # Product::COLOR::RED # => "red" # Product::COLOR::GREEN #=> "green" new_module = const_set name.to_s.upcase, Module.new enums.each { |const| new_module.const_set(const.to_s.upcase, const.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 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 |