Skip to content

Commit a426b1d

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

File tree

2 files changed

+29
-5
lines changed

2 files changed

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

0 commit comments

Comments
 (0)