Почему я получаю эту ошибку внешнего ключа в моих тестах Phoenix? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть следующий тест в Фениксе:

test "list_orders/0 returns all orders" do
  {:ok, user} = %User{}
                |> User.changeset(@user_attrs)
                |> Repo.insert()

  changeset = %Order{}
              |> Order.changeset(@valid_attrs)
              |> Ecto.Changeset.put_change(:user_id, user.id)

  {:ok, order} = Repo.insert(changeset)

  assert MWS.list_orders() == [order]
end

, который не может вставить changeset в Repo, поскольку user_id не выполняет ограничение внешнего ключа. Но я использую user.id, который возвращается от пользователя, успешно вставленного в базу данных?

Есть идеи, что я здесь не так делаю?

Спасибо!

1 Ответ

0 голосов
/ 17 октября 2019

Как отмечает Калвин Хом, вам нужно взглянуть на схему / миграции, чтобы понять это:

defmodule BarronWatchCompany.Repo.Migrations.AddUsersToOrders do
  use Ecto.Migration

  def change do

    alter table(:orders) do
      add :user_id, references(:orders, on_delete: :nothing)
    end

    create index(:orders, [:user_id])
  end
end

Проблема в том, что я ссылался на заказы, а не на пользователей. Я перенес базу данных:

defmodule BarronWatchCompany.Repo.Migrations.AddUserToOrders do
  use Ecto.Migration

  def up do
    drop constraint(:orders, "orders_user_id_fkey")

    alter table(:orders) do
      modify :user_id, references(:users, on_delete: :nothing), null: false
    end
  end
end

И теперь я могу создавать заказы:)

...