Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 2 additions & 10 deletions lib/ecto/changeset.ex
Original file line number Diff line number Diff line change
Expand Up @@ -538,12 +538,12 @@ defmodule Ecto.Changeset do
case fetch_change(changeset, field) do
{:ok, new_value} ->
case type do
{tag, relation} when tag in @relations ->
{tag, _relation} when tag in @relations ->
if opts != [] do
raise ArgumentError, "invalid options for #{tag} field"
end

relation_changed?(relation.cardinality, new_value)
true

_ ->
Enum.all?(opts, fn
Expand All @@ -567,14 +567,6 @@ defmodule Ecto.Changeset do
end
end

defp relation_changed?(:one, changeset) do
changeset.action != :update or changeset.changes != %{}
end

defp relation_changed?(:many, changesets) do
Enum.any?(changesets, &relation_changed?(:one, &1))
end

@doc """
Returns the default empty values used by `Ecto.Changeset`.

Expand Down
27 changes: 27 additions & 0 deletions test/ecto/changeset/belongs_to_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -569,4 +569,31 @@ defmodule Ecto.Changeset.BelongsToTest do
changeset2 = %{changeset | action: :delete}
assert Relation.apply_changes(embed, changeset2) == nil
end

test "changed?/2 with assocs" do
new_profile = %Profile{name: "profile"}

changeset =
%Author{}
|> Changeset.change()
|> Changeset.put_assoc(:profile, new_profile)

assert Changeset.changed?(changeset, :profile)

{:ok, existing_profile} = TestRepo.insert(%Profile{name: "profile"})

changeset =
%Author{}
|> Changeset.change()
|> Changeset.put_assoc(:profile, existing_profile)

assert Changeset.changed?(changeset, :profile)

changeset =
%Author{profile: existing_profile}
|> Changeset.change()
|> Changeset.put_assoc(:profile, nil)

assert Changeset.changed?(changeset, :profile)
end
end
Loading