Skip to content

Commit f96de8b

Browse files
committed
Fixed multiple enums declaration with _prefix/_suffix
enum is broken when multiple values and `_prefix/_suffix: true` options are passed. Because the `enum_prefix/enum_suffix` variables are overwritten from `true` to `name` during the first loop, and one should return `true` at the second loop, got already overwritten. Introduced by rails#40992
1 parent f250208 commit f96de8b

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

activerecord/lib/active_record/enum.rb

+10-4
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,17 @@ def enum(definitions)
187187

188188
value_method_names = []
189189
_enum_methods_module.module_eval do
190-
enum_prefix = name if enum_prefix == true
191-
prefix = "#{enum_prefix}_" if enum_prefix
190+
prefix = if enum_prefix == true
191+
"#{name}_"
192+
elsif enum_prefix
193+
"#{enum_prefix}_"
194+
end
192195

193-
enum_suffix = name if enum_suffix == true
194-
suffix = "_#{enum_suffix}" if enum_suffix
196+
suffix = if enum_suffix == true
197+
"_#{name}"
198+
elsif enum_suffix
199+
"_#{enum_suffix}"
200+
end
195201

196202
pairs = values.respond_to?(:each_pair) ? values.each_pair : values.each_with_index
197203
pairs.each do |label, value|

activerecord/test/cases/enum_test.rb

+32
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,38 @@ def self.name; "Book"; end
511511
assert_predicate book2, :single?
512512
end
513513

514+
test "declare multiple enums with { _prefix: true }" do
515+
klass = Class.new(ActiveRecord::Base) do
516+
self.table_name = "books"
517+
518+
enum(
519+
status: [:value_1],
520+
last_read: [:value_1],
521+
_prefix: true
522+
)
523+
end
524+
525+
instance = klass.new
526+
assert_respond_to instance, :status_value_1?
527+
assert_respond_to instance, :last_read_value_1?
528+
end
529+
530+
test "declare multiple enums with { _suffix: true }" do
531+
klass = Class.new(ActiveRecord::Base) do
532+
self.table_name = "books"
533+
534+
enum(
535+
status: [:value_1],
536+
last_read: [:value_1],
537+
_suffix: true
538+
)
539+
end
540+
541+
instance = klass.new
542+
assert_respond_to instance, :value_1_status?
543+
assert_respond_to instance, :value_1_last_read?
544+
end
545+
514546
test "enum with alias_attribute" do
515547
klass = Class.new(ActiveRecord::Base) do
516548
self.table_name = "books"

0 commit comments

Comments
 (0)