I made an example with nodes and leafs
schema "nodes" do
field(:name, :string)
has_many(:leafs, Leaf)
timestamps()
end
...
schema "leafs" do
field(:name, :string)
belongs_to(:node, Node)
timestamps()
end
I load a node, with leafs…
iex> import Ecto.Changeset
iex> n = EctoLab.Fk.get_node(1) |> EctoLab.Repo.preload(:leafs)
%EctoLab.Fk.Node{
__meta__: #Ecto.Schema.Metadata<:loaded, "nodes">,
id: 1,
inserted_at: ~N[2018-09-06 12:41:43.978124],
leafs: [
%EctoLab.Fk.Leaf{
__meta__: #Ecto.Schema.Metadata<:loaded, "leafs">,
id: 2,
inserted_at: ~N[2018-09-06 12:53:11.336298],
name: "lolo",
node: #Ecto.Association.NotLoaded<association :node is not loaded>,
node_id: 1,
updated_at: ~N[2018-09-06 12:53:11.336308]
}
],
name: "koko",
updated_at: ~N[2018-09-06 12:41:43.979841]
}
And here, if I try to delete the node
iex> changeset = Ecto.Changeset.change(n)
iex> changeset = foreign_key_constraint(changeset, :leafs, name: :leafs_node_id_fkey, message: "still exist")
#Ecto.Changeset<action: nil, changes: %{}, errors: [], data: #EctoLab.Fk.Node<>,
valid?: true>
iex(30)> EctoLab.Repo.delete(changeset)
14:59:08.942 [debug] QUERY OK db=0.1ms
begin []
14:59:08.949 [debug] QUERY ERROR db=6.4ms
DELETE FROM "nodes" WHERE "id" = $1 [1]
14:59:08.949 [debug] QUERY OK db=0.2ms
rollback []
{:error,
#Ecto.Changeset<
action: :delete,
changes: %{},
errors: [leafs: {"still exist", []}],
data: #EctoLab.Fk.Node<>,
valid?: false
>}
I cannot delete it, because it has leafs, and I got the message in the changeset.


















