Skip to content

Commit 49a65a8

Browse files
Revert "Revert "Merge pull request rails#49769 from jonathanhefner/active_record-enum-non-column-backed""
This reverts commit b5fe9ec.
1 parent 4902a98 commit 49a65a8

File tree

4 files changed

+30
-19
lines changed

4 files changed

+30
-19
lines changed

activerecord/lib/active_record/enum.rb

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,6 @@ def self.extended(base) # :nodoc:
167167
base.class_attribute(:defined_enums, instance_writer: false, default: {})
168168
end
169169

170-
def load_schema! # :nodoc:
171-
defined_enums.each_key do |name|
172-
unless columns_hash.key?(resolve_attribute_name(name))
173-
raise "Unknown enum attribute '#{name}' for #{self.name}. Enums must be" \
174-
" backed by a database column."
175-
end
176-
end
177-
end
178-
179170
class EnumType < Type::Value # :nodoc:
180171
delegate :type, to: :subtype
181172

@@ -264,7 +255,13 @@ def _enum(name, values, prefix: nil, suffix: nil, scopes: true, instance_methods
264255

265256
attribute(name, **options)
266257

267-
decorate_attributes([name]) do |name, subtype|
258+
decorate_attributes([name]) do |_name, subtype|
259+
if subtype == ActiveModel::Type.default_value
260+
raise "Undeclared attribute type for enum '#{name}' in #{self.name}. Enums must be" \
261+
" backed by a database column or declared with an explicit type" \
262+
" via `attribute`."
263+
end
264+
268265
subtype = subtype.subtype if EnumType === subtype
269266
EnumType.new(name, enum_values, subtype, raise_on_invalid_values: !validate)
270267
end

activerecord/lib/active_record/model_schema.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -596,8 +596,6 @@ def load_schema!
596596
@columns_hash = columns_hash.freeze
597597

598598
_default_attributes # Precompute to cache DB-dependent attribute types
599-
600-
super
601599
end
602600

603601
# Guesses the table name, but does not decorate it with prefix and suffix information.

activerecord/test/cases/enum_test.rb

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,15 +1157,28 @@ def self.name
11571157
end
11581158

11591159
test "raises for attributes with undeclared type" do
1160-
klass = Class.new(Book) do
1161-
def self.name; "Book"; end
1162-
enum :typeless_genre, [:adventure, :comic]
1160+
klass = assert_deprecated(ActiveRecord.deprecator) do
1161+
Class.new(Book) do
1162+
def self.name; "Book"; end
1163+
enum typeless_genre: [:adventure, :comic]
1164+
end
11631165
end
11641166

11651167
error = assert_raises(RuntimeError) do
1166-
klass.type_for_attribute(:typeless_genre) # load schema
1168+
klass.type_for_attribute(:typeless_genre)
1169+
end
1170+
assert_match "Undeclared attribute type for enum 'typeless_genre' in Book", error.message
1171+
end
1172+
1173+
test "supports attributes declared with a explicit type" do
1174+
klass = assert_deprecated(ActiveRecord.deprecator) do
1175+
Class.new(Book) do
1176+
attribute :my_genre, :integer
1177+
enum my_genre: [:adventure, :comic]
1178+
end
11671179
end
1168-
assert_match "Unknown enum attribute 'typeless_genre'", error.message
1180+
1181+
assert_equal :integer, klass.type_for_attribute(:my_genre).type
11691182
end
11701183

11711184
test "default methods can be disabled by :_instance_methods" do

railties/test/application/test_test.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,14 @@ class UserTest < ActiveSupport::TestCase
335335

336336
app_file "app/models/user.rb", <<-RUBY
337337
class User < ApplicationRecord
338-
enum :type, [:admin, :user]
338+
def self.load_schema!
339+
super
340+
raise "SCHEMA LOADED!"
341+
end
339342
end
340343
RUBY
341344

342-
assert_unsuccessful_run "models/user_test.rb", "Unknown enum attribute 'type' for User"
345+
assert_unsuccessful_run "models/user_test.rb", "SCHEMA LOADED!"
343346
end
344347

345348
test "database-dependent attribute types are resolved when parallel tests are run in eager load context" do

0 commit comments

Comments
 (0)