File tree Expand file tree Collapse file tree 2 files changed +29
-5
lines changed
Expand file tree Collapse file tree 2 files changed +29
-5
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
499513end
You can’t perform that action at this time.
0 commit comments