Skip to content

Commit accd0c4

Browse files
committed
MONGOID-4532 Correctly determine module path for associations (#4536)
1 parent 6243dda commit accd0c4

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

lib/mongoid/association/relatable.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ def initialize(_class, name, opts = {}, &block)
5757
@name = name
5858
@options = opts
5959
@extension = nil
60+
61+
@module_path = _class.name ? _class.name.split('::')[0..-2].join('::') : ''
62+
@module_path << '::' unless @module_path.empty?
63+
6064
create_extension!(&block)
6165
validate!
6266
end
@@ -147,7 +151,7 @@ def inverse_type; end
147151
#
148152
# @since 7.0
149153
def relation_class_name
150-
@class_name ||= @options[:class_name] || ActiveSupport::Inflector.classify(name)
154+
@class_name ||= @options[:class_name] || ActiveSupport::Inflector.classify(name_with_module)
151155
end
152156
alias :class_name :relation_class_name
153157

@@ -321,6 +325,10 @@ def validate?
321325

322326
private
323327

328+
def name_with_module
329+
@module_path + name.to_s.capitalize
330+
end
331+
324332
# Gets the model classes with inverse associations of this model. This is used to determine
325333
# the classes on the other end of polymorphic relations with models.
326334
def inverse_association_classes

spec/mongoid/association/referenced/has_one_spec.rb

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,33 @@ class BelongingObject; include Mongoid::Document; end
890890

891891
describe '#relation_class_name' do
892892

893+
context 'when the classes are defined in a module' do
894+
895+
let(:define_classes) do
896+
module HasOneAssociationClassName
897+
class OwnedClass
898+
include Mongoid::Document
899+
900+
belongs_to :owner_class
901+
end
902+
903+
class OwnerClass
904+
include Mongoid::Document
905+
906+
has_one :owned_class
907+
end
908+
end
909+
end
910+
911+
it 'returns the proper namespaced class name' do
912+
define_classes
913+
914+
expect(
915+
HasOneAssociationClassName::OwnedClass.relations['owner_class'].relation_class_name
916+
).to eq('HasOneAssociationClassName::OwnerClass')
917+
end
918+
end
919+
893920
context 'when the :class_name option is specified' do
894921

895922
let(:options) do
@@ -1200,6 +1227,38 @@ class OtherBelongingObject; end
12001227
end
12011228
end
12021229

1230+
context 'when the classes are defined in a module' do
1231+
1232+
let(:define_classes) do
1233+
module HasOneAssociationModuleDefinitions
1234+
class OwnedClass
1235+
include Mongoid::Document
1236+
1237+
belongs_to :owner_class
1238+
end
1239+
1240+
class OwnerClass
1241+
include Mongoid::Document
1242+
1243+
has_one :owned_class
1244+
end
1245+
end
1246+
end
1247+
1248+
let(:owner) do
1249+
HasOneAssociationModuleDefinitions::OwnerClass.create!
1250+
end
1251+
1252+
let(:owned) do
1253+
define_classes
1254+
HasOneAssociationModuleDefinitions::OwnedClass.create!(owner_class: owner)
1255+
end
1256+
1257+
it 'successfully creates the owned document' do
1258+
expect { owned }.not_to raise_error
1259+
end
1260+
end
1261+
12031262
describe '#nested_builder' do
12041263

12051264
it 'returns an instance of Association::Nested::One' do

0 commit comments

Comments
 (0)