diff --git a/lib/mongoid/fields/foreign_key.rb b/lib/mongoid/fields/foreign_key.rb index f9918dc17e..5882f74bec 100644 --- a/lib/mongoid/fields/foreign_key.rb +++ b/lib/mongoid/fields/foreign_key.rb @@ -63,7 +63,11 @@ def foreign_key? # @since 3.0.0 def evolve(object) if object_id_field? || object.is_a?(Document) - object.__evolve_object_id__ + if metadata.polymorphic? && constraint + constraint.convert(object) + else + object.__evolve_object_id__ + end else related_id_field.evolve(object) end diff --git a/spec/mongoid/fields/foreign_key_spec.rb b/spec/mongoid/fields/foreign_key_spec.rb index 5fccd5dfbe..2b100c631b 100644 --- a/spec/mongoid/fields/foreign_key_spec.rb +++ b/spec/mongoid/fields/foreign_key_spec.rb @@ -444,6 +444,29 @@ end end end + + context "when the metadata is polymoprhic" do + + let(:metadata) do + Agent.reflect_on_association(:names) + end + + let(:field) do + described_class.new(:nameable_id, type: Object, metadata: metadata) + end + + let(:value) do + BSON::ObjectId.new().to_s + end + + let(:evolved) do + field.evolve(value) + end + + it "does not change the foreign key" do + expect(evolved).to be(value) + end + end end describe "#lazy?" do