broke

broke

Hello, I’m getting the following error while running a unit test that deletes an “artist” entity that has “tag” associations (the desired behavior is for the associations to be deleted when the parent is deleted).

** (Ecto.ConstraintError) constraint error when attempting to delete struct:

         * artist_tags_artist_id_fkey (foreign_key_constraint)

     If you would like to stop this constraint violation from raising an
     exception and instead add it as an error to your changeset, please
     call `foreign_key_constraint/3` on your changeset with the constraint
     `:name` as an option.

     The changeset has not defined any constraint.

     code: assert {:ok, %Artist{}} = Artists.delete_artist(artist)
     stacktrace:
       (ecto 3.2.5) lib/ecto/repo/schema.ex:689: anonymous fn/4 in Ecto.Repo.Schema.constraints_to_errors/3
       (elixir 1.10.0) lib/enum.ex:1396: Enum."-map/2-lists^map/1-0-"/2
       (ecto 3.2.5) lib/ecto/repo/schema.ex:674: Ecto.Repo.Schema.constraints_to_errors/3
       (ecto 3.2.5) lib/ecto/repo/schema.ex:451: anonymous fn/10 in Ecto.Repo.Schema.do_delete/4
       test/narktar/artists_test.exs:75: (test)

This is the migration used to create the join-table “artist_tags” where I use on_delete: :delete_all

def change do
    create table(:artist_tags) do
      add :artist_id, references(:artists, on_delete: :delete_all), null: false
      add :tag_id, references(:tags, on_delete: :delete_all), null: false

      timestamps()

    end
    create unique_index(:artist_tags, [:artist_id, :tag_id])
  end

I verified there is CASCADE ON DELETE on the foreign key constraint in the Postgres database, and have no problems deleting artists (and their associated tags) manually with queries against Postgres.

I feel Iike I might be missing something simple and any help would be appreciated. I can also post any more details regarding the parent schemas if that would be useful.

Showing Posts 1 to 4

dimitarvp

dimitarvp

Can you show the code of both Ecto schema modules (artist and tag)?

broke

broke OP

Sure, here are the artist and tag schemas. I also have a schema for the join relationship that I’ll include as well.

defmodule Narktar.Artists.Artist do
  use Ecto.Schema
  use Arc.Ecto.Schema
  import Ecto.Changeset
  alias Narktar.Artists.Tag
  alias Narktar.Repo

  schema "artists" do
    field :description, :string
    field :image_path, Narktar.Image.Type
    field :like_count, :integer
    field :members, {:array, :string}
    field :name, :string
    field :uuid, :string
    field :urls, {:array, :string}
    many_to_many :tags, Tag, join_through: Narktar.Artists.ArtistTag, on_replace: :delete

    timestamps()
  end

  @doc false
  def changeset(artist, attrs) do
    artist
    |> Map.update(:uuid, Ecto.UUID.generate, fn val -> val || Ecto.UUID.generate end)
    |> cast(attrs, [:name, :description, :members, :urls, :like_count])
    |> cast_attachments(attrs, [:image_path])
    |> put_assoc(:tags, parse_tags(attrs))
    |> validate_required([:name, :uuid, :like_count])
  end

  defp parse_tags(attrs) do
    (attrs["tags"] || "")
    |> String.split(",")
    |> Enum.map(&String.trim/1)
    |> Enum.reject(& &1 == "")
    |> Enum.map(&get_or_insert_tag/1)
  end

  defp get_or_insert_tag(name) do
    Repo.get_by(Narktar.Artists.Tag, name: name) ||
      Repo.insert!(%Tag{name: name})
  end

end
defmodule Narktar.Artists.Tag do
  use Ecto.Schema
  import Ecto.Changeset
  alias Narktar.Artists.Artist

  schema "tags" do
    field :name, :string
    many_to_many :artists, Artist, join_through: Narktar.Artists.ArtistTag
    timestamps()
  end

  @doc false
  def changeset(tag, attrs) do
    tag
    |> cast(attrs, [:name])
    |> validate_required([:name])
  end
end
defmodule Narktar.Artists.ArtistTag do
  use Ecto.Schema

  schema "artist_tags" do
    belongs_to :artist, Narktar.Artists.Artist
    belongs_to :tag, Narktar.Artists.Tag
    timestamps()
  end
end
hawkyre

hawkyre

I am getting the same problem right now

Nicd

Nicd

I have replied to you in the other thread.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews