(Ecto.ConstraintError) constraint error when attempting to insert struct: (foreign_key_constraint)

Hello all,

Strangely, I’m getting this error in production (Gigalixir) but not on local.

ERROR

Request: POST /parent_organizations/1/users

** (exit) an exception was raised:
    ** (Ecto.ConstraintError) constraint error when attempting to insert struct:

    * parent_organizations_users_parent_organization_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.

        (ecto 3.4.5) lib/ecto/repo/schema.ex:700: anonymous fn/4 in Ecto.Repo.Schema.constraints_to_errors/3
        (elixir 1.10.4) lib/enum.ex:1396: Enum."-map/2-lists^map/1-0-"/2
        (ecto 3.4.5) lib/ecto/repo/schema.ex:685: Ecto.Repo.Schema.constraints_to_errors/3
        (ecto 3.4.5) lib/ecto/repo/schema.ex:666: Ecto.Repo.Schema.apply/4
        (ecto 3.4.5) lib/ecto/repo/schema.ex:263: anonymous fn/15 in Ecto.Repo.Schema.do_insert/4
        (rocketship 0.1.0) lib/rocketship_web/controllers/parent_organization_user_controller.ex:21: RocketshipWeb.ParentOrganizationUserController.create/2
        (rocketship 0.1.0) lib/rocketship_web/controllers/parent_organization_user_controller.ex:1: RocketshipWeb.ParentOrganizationUserController.action/2
        (rocketship 0.1.0) lib/rocketship_web/controllers/parent_organization_user_controller.ex:1: RocketshipWeb.ParentOrganizationUserController.phoenix_controller_pipeline/2

CONTROLLER

def create(conn, %{"parent_organization_user" => parent_organization_user_params, "parent_organization_id" => parent_organization_id}) do
    parent_organization_user_params = Map.put(parent_organization_user_params, "parent_organization_id", parent_organization_id)
    case Organizations.create_parent_organization_user(parent_organization_user_params) do
      {:ok, parent_organization_user} ->
        conn
        |> put_flash(:info, "Parent organization user created successfully.")
        |> redirect(to: Routes.parent_organization_user_path(conn, :index, parent_organization_id))

      {:error, %Ecto.Changeset{} = changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end

SCHEMA

defmodule Rocketship.Organizations.ParentOrganizationUser do
  use Ecto.Schema
  import Ecto.Changeset

  schema "parent_organizations_users" do
    field :role, :string
    
    belongs_to :user, Rocketship.Accounts.User
    belongs_to :parent_organization, Rocketship.Organizations.ParentOrganization

    timestamps()
  end

  @doc false
  def changeset(parent_organization_user, attrs) do
    parent_organization_user
    |> cast(attrs, [:role, :parent_organization_id, :user_id])
    |> validate_required([:role, :parent_organization_id, :user_id])
  end
end

Hello all, I found the mistake, I had a typo in my migration file.

The typo

add :parent_organization_id, references(:organizations, on_delete: :delete_all)

Should be references(:parent_organizations

The reason it worked on local but not production is because I hadn’t created organizations yet.

Thanks @jesse for helping debug this.

1 Like