aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/enum.rb
diff options
context:
space:
mode:
authorIgor Kapkov <igasgeek@me.com>2015-04-19 17:25:09 +0800
committerIgor Kapkov <igasgeek@me.com>2015-06-12 12:07:55 +0800
commit09bef7684a5ddd0e37d8bed38858a9fa866e1df2 (patch)
tree18b12f609b8b4a3b1e79032c10fb38a7607c7718 /activerecord/lib/active_record/enum.rb
parentfcbd2e821e12fdf66ad2f28e97992a7cd75f529e (diff)
downloadrails-09bef7684a5ddd0e37d8bed38858a9fa866e1df2.tar.gz
rails-09bef7684a5ddd0e37d8bed38858a9fa866e1df2.tar.bz2
rails-09bef7684a5ddd0e37d8bed38858a9fa866e1df2.zip
Add enum prefix/suffix option to enum definition
Fixes #17511 and #17415
Diffstat (limited to 'activerecord/lib/active_record/enum.rb')
-rw-r--r--activerecord/lib/active_record/enum.rb42
1 files changed, 36 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/enum.rb b/activerecord/lib/active_record/enum.rb
index 2b99899e42..ad33c84dbc 100644
--- a/activerecord/lib/active_record/enum.rb
+++ b/activerecord/lib/active_record/enum.rb
@@ -75,6 +75,22 @@ module ActiveRecord
#
# Conversation.where("status <> ?", Conversation.statuses[:archived])
#
+ # You can use <tt>:enum_prefix</tt>/<tt>:enum_suffix</tt> option then you need
+ # to define multiple enums with same values. If option value is <tt>true</tt>,
+ # the methods are prefixed/suffixed with the name of the enum.
+ #
+ # class Invoice < ActiveRecord::Base
+ # enum verification: [:done, :fail], enum_prefix: true
+ # end
+ #
+ # It is also possible to supply a custom prefix.
+ #
+ # class Invoice < ActiveRecord::Base
+ # enum verification: [:done, :fail], enum_prefix: :verification_status
+ # end
+ #
+ # Note that <tt>:enum_prefix</tt>/<tt>:enum_postfix</tt> are reserved keywords
+ # and can not be used as an enum name.
module Enum
def self.extended(base) # :nodoc:
@@ -121,6 +137,8 @@ module ActiveRecord
def enum(definitions)
klass = self
+ enum_prefix = definitions.delete(:enum_prefix)
+ enum_suffix = definitions.delete(:enum_suffix)
definitions.each do |name, values|
# statuses = { }
enum_values = ActiveSupport::HashWithIndifferentAccess.new
@@ -138,19 +156,31 @@ module ActiveRecord
_enum_methods_module.module_eval do
pairs = values.respond_to?(:each_pair) ? values.each_pair : values.each_with_index
pairs.each do |value, i|
+ if enum_prefix == true
+ prefix = "#{name}_"
+ elsif enum_prefix
+ prefix = "#{enum_prefix}_"
+ end
+ if enum_suffix == true
+ suffix = "_#{name}"
+ elsif enum_suffix
+ suffix = "_#{enum_suffix}"
+ end
+
+ value_method_name = "#{prefix}#{value}#{suffix}"
enum_values[value] = i
# def active?() status == 0 end
- klass.send(:detect_enum_conflict!, name, "#{value}?")
- define_method("#{value}?") { self[name] == value.to_s }
+ klass.send(:detect_enum_conflict!, name, "#{value_method_name}?")
+ define_method("#{value_method_name}?") { self[name] == value.to_s }
# def active!() update! status: :active end
- klass.send(:detect_enum_conflict!, name, "#{value}!")
- define_method("#{value}!") { update! name => value }
+ klass.send(:detect_enum_conflict!, name, "#{value_method_name}!")
+ define_method("#{value_method_name}!") { update! name => value }
# scope :active, -> { where status: 0 }
- klass.send(:detect_enum_conflict!, name, value, true)
- klass.scope value, -> { klass.where name => value }
+ klass.send(:detect_enum_conflict!, name, value_method_name, true)
+ klass.scope value_method_name, -> { klass.where name => value }
end
end
defined_enums[name.to_s] = enum_values