Skip to content

Commit 336fa48

Browse files
Use NameError for missing association model class
Follow-up to rails#46605. `AssociationReflection#automatic_inverse_of` expects a `NameError` to be raised when a model class is missing. rails#46605 changed the error to an `ArgumentError`, which caused failures in isolated Active Record tests: * https://buildkite.com/rails/rails/builds/91327#0184c50a-a38c-496e-b877-2946a3966cd9/1453-1463 * https://buildkite.com/rails/rails/builds/91327#0184c50a-a38e-4243-9b7c-82ff1728216a/1438-1448 * https://buildkite.com/rails/rails/builds/91327#0184c50a-a38e-4243-9b7c-82ff1728216a/1596-1606 Additionally, other `MacroReflection` subclasses raise a `NameError`, not an `ArgumentError`, when the relevant class is missing. (See `MacroReflection#compute_class`.) This commit changes the error back to `NameError`, and adds a regression test to catch the problem even when the tests are not isolated. This commit also reverts rails#46616 and rails#46619, which were only to address the failures in the isolated tests. For additional context, see rails#32113.
1 parent 76b440f commit 336fa48

File tree

6 files changed

+11
-9
lines changed

6 files changed

+11
-9
lines changed

activerecord/lib/active_record/reflection.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ def compute_class(name)
428428
rescue NameError
429429
message = "Missing model class #{name} for the #{active_record}##{self.name} association."
430430
message += " You can specify a different model class with the :class_name option." unless options[:class_name]
431-
raise ArgumentError, message
431+
raise NameError, message
432432
end
433433

434434
unless klass < ActiveRecord::Base

activerecord/test/cases/associations_test.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,15 +421,15 @@ class ModelAssociatedToClassesThatDoNotExist < ActiveRecord::Base
421421
end
422422

423423
def test_associations_raise_with_name_error_if_associated_to_classes_that_do_not_exist
424-
assert_raises ArgumentError do
424+
assert_raises NameError do
425425
ModelAssociatedToClassesThatDoNotExist.new.non_existent_has_one_class
426426
end
427427

428-
assert_raises ArgumentError do
428+
assert_raises NameError do
429429
ModelAssociatedToClassesThatDoNotExist.new.non_existent_belongs_to_class
430430
end
431431

432-
assert_raises ArgumentError do
432+
assert_raises NameError do
433433
ModelAssociatedToClassesThatDoNotExist.new.non_existent_has_many_classes
434434
end
435435
end

activerecord/test/cases/finder_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
require "models/customer"
1919
require "models/toy"
2020
require "models/matey"
21-
require "models/dog_lover"
2221
require "models/dog"
2322
require "models/car"
2423
require "models/tyre"

activerecord/test/cases/fixtures_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
require "models/computer"
1818
require "models/course"
1919
require "models/developer"
20-
require "models/dog_lover"
2120
require "models/dog"
2221
require "models/doubloon"
2322
require "models/essay"

activerecord/test/cases/nested_attributes_test.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
require "cases/helper"
44
require "models/pirate"
5-
require "models/developer"
65
require "models/ship"
76
require "models/ship_part"
87
require "models/bird"

activerecord/test/cases/reflection_test.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def test_irregular_reflection_class_name
139139
end
140140

141141
def test_reflection_klass_not_found_with_no_class_name_option
142-
error = assert_raise(ArgumentError) do
142+
error = assert_raise(NameError) do
143143
UserWithInvalidRelation.reflect_on_association(:not_a_class).klass
144144
end
145145

@@ -150,7 +150,7 @@ def test_reflection_klass_not_found_with_no_class_name_option
150150
end
151151

152152
def test_reflection_klass_not_found_with_pointer_to_non_existent_class_name
153-
error = assert_raise(ArgumentError) do
153+
error = assert_raise(NameError) do
154154
UserWithInvalidRelation.reflect_on_association(:class_name_provided_not_a_class).klass
155155
end
156156

@@ -560,6 +560,11 @@ def test_reflect_on_association_accepts_strings
560560
end
561561
end
562562

563+
def test_automatic_inverse_suppresses_name_error_for_association
564+
reflection = UserWithInvalidRelation.reflect_on_association(:not_a_class)
565+
assert_not reflection.dup.has_inverse? # dup to prevent global memoization
566+
end
567+
563568
private
564569
def assert_reflection(klass, association, options)
565570
assert reflection = klass.reflect_on_association(association)

0 commit comments

Comments
 (0)