Skip to content

Commit 78ce299

Browse files
authored
Merge pull request rails#51948 from justinko/issue-51938
Restore inferred association class with the same modularized name
2 parents 9e597ea + 939a8f6 commit 78ce299

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

activerecord/lib/active_record/reflection.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -428,15 +428,19 @@ def autosave=(autosave)
428428
# a new association object. Use +build_association+ or +create_association+
429429
# instead. This allows plugins to hook into association object creation.
430430
def klass
431-
@klass ||= compute_class(compute_name(class_name))
431+
@klass ||= _klass(class_name)
432432
end
433433

434-
def compute_class(name)
435-
name.constantize
434+
def _klass(class_name) # :nodoc:
435+
if active_record.name.demodulize == class_name
436+
return compute_class("::#{class_name}") rescue NameError
437+
end
438+
439+
compute_class(class_name)
436440
end
437441

438-
def compute_name(name) # :nodoc:
439-
active_record.name.demodulize == name ? "::#{name}" : name
442+
def compute_class(name)
443+
name.constantize
440444
end
441445

442446
# Returns +true+ if +self+ and +other_aggregation+ have the same +name+ attribute, +active_record+ attribute,
@@ -986,7 +990,7 @@ def through_reflection?
986990
end
987991

988992
def klass
989-
@klass ||= delegate_reflection.compute_class(compute_name(class_name))
993+
@klass ||= delegate_reflection._klass(class_name)
990994
end
991995

992996
# Returns the source of the through reflection. It checks both a singularized

activerecord/test/cases/reflection_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,18 @@ def test_reflection_klass_with_same_demodularized_different_modularized_name
208208
assert_equal Nested::User, reflection.klass
209209
end
210210

211+
def test_reflection_klass_with_same_modularized_name
212+
reflection = ActiveRecord::Reflection.create(
213+
:has_many,
214+
:nested_users,
215+
nil,
216+
{},
217+
Nested::NestedUser
218+
)
219+
220+
assert_equal Nested::NestedUser, reflection.klass
221+
end
222+
211223
def test_aggregation_reflection
212224
reflection_for_address = AggregateReflection.new(
213225
:address, nil, { mapping: [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer

activerecord/test/models/user.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,8 @@ module Nested
2828
class User < ActiveRecord::Base
2929
self.table_name = "users"
3030
end
31+
32+
class NestedUser < ActiveRecord::Base
33+
has_many :nested_users
34+
end
3135
end

0 commit comments

Comments
 (0)