diff --git a/lib/ecto/changeset.ex b/lib/ecto/changeset.ex index f79066955f..09dd81ebb4 100644 --- a/lib/ecto/changeset.ex +++ b/lib/ecto/changeset.ex @@ -4323,11 +4323,13 @@ defmodule Ecto.Changeset do acc = Map.put(acc, key, relation_changed) - with %Ecto.Association.BelongsTo{related_key: related_key} <- relation, - %{^related_key => id} <- relation_changed do - Map.put(acc, relation.owner_key, id) - else - _ -> acc + case relation do + %Ecto.Association.BelongsTo{related_key: related_key, owner_key: owner_key} -> + id = relation_changed && Map.fetch!(relation_changed, related_key) + Map.put(acc, owner_key, id) + + _ -> + acc end end diff --git a/test/ecto/changeset_test.exs b/test/ecto/changeset_test.exs index 3f1b7910b6..d4b2054ead 100644 --- a/test/ecto/changeset_test.exs +++ b/test/ecto/changeset_test.exs @@ -1083,8 +1083,10 @@ defmodule Ecto.ChangesetTest do assert changed_post.title == "foo" assert changed_post.category_id == category.category_id + post_with_category = %Post{category_id: 5} + changeset = - post + post_with_category |> changeset(%{"title" => "foo"}) |> put_assoc(:category, nil)