Skip to content

Commit 580720d

Browse files
reset parent assoc when after nil prelaod
1 parent 5dc886a commit 580720d

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

lib/ecto/repo/schema.ex

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,11 +1142,21 @@ defmodule Ecto.Repo.Schema do
11421142
defp reset_parent?(changes, data, assoc) do
11431143
%{field: field, owner_key: owner_key, related_key: related_key} = assoc
11441144

1145-
with %{^owner_key => owner_value} <- changes,
1146-
%{^field => %{^related_key => related_value}} when owner_value != related_value <- data do
1147-
true
1148-
else
1149-
_ -> false
1145+
case changes do
1146+
%{^owner_key => owner_value} ->
1147+
case data do
1148+
%{^field => %{^related_key => related_value}} when owner_value != related_value ->
1149+
true
1150+
1151+
%{^field => nil} when owner_value != nil ->
1152+
true
1153+
1154+
_ ->
1155+
false
1156+
end
1157+
1158+
_ ->
1159+
false
11501160
end
11511161
end
11521162

test/ecto/repo/belongs_to_test.exs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,4 +496,19 @@ defmodule Ecto.Repo.BelongsToTest do
496496
assert updated_schema.assoc_id == 2
497497
assert %Ecto.Association.NotLoaded{} = updated_schema.assoc
498498
end
499+
500+
@tag :wtf
501+
test "reset assoc when foreign key update results in a mismatch and parent is nil" do
502+
schema = %MySchema{} |> TestRepo.insert!() |> TestRepo.preload(:assoc)
503+
assert schema.assoc_id == nil
504+
assert schema.assoc == nil
505+
506+
updated_schema =
507+
schema
508+
|> Ecto.Changeset.change(%{assoc_id: 2})
509+
|> TestRepo.update!()
510+
511+
assert updated_schema.assoc_id == 2
512+
assert %Ecto.Association.NotLoaded{} = updated_schema.assoc
513+
end
499514
end

0 commit comments

Comments
 (0)