-
Type:
Bug
-
Resolution: Won't Fix
-
Priority:
Major - P3
-
Affects Version/s: 5.1.4, 5.1.5, 6.0.2
-
Component/s: None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
Here is some unusual code that behaves unexpectedly :
class King
include Mongoid::Document
end
class Peasant
include Mongoid::Document
belongs_to :king
end
class Harvest
include Mongoid::Document
belongs_to :peasant, foreign_key: 'king_id'
end
RSpec.describe do
let(:king) { King.create! }
let(:peasant) { Peasant.create!(king: king) }
before { Harvest.create!(peasant: peasant) }
it { expect(peasant.king_id).to be == king.id }
it { expect(peasant.king).to be == king }
end
The first test (king_id == king.id) will pass, but the second one (king == king) will fail :
Failures:
1) should be == #<King:0x007fa21d378d10>
Failure/Error: it { expect(peasant.king).to be == king }
expected: == #<King _id: 581b92adcf6bf320795fcd68, >
got: #<Harvest _id: 581b92adcf6bf320795fcd6a, king_id: BSON::ObjectId('581b92adcf6bf320795fcd69')>
I am aware that the part asking for foreign_key: 'king_id' is a bit weird, but we need to do this in our current refactoring.
We are using 5.1.4/5, but I have tested 6.0.2 and the issue is also there.
I have done a bit of tracing, and the king field is overwritten when executing the Harvest.create!, in #set_relation, in mongoid/relations/accessors.rb.