为什么我的 phoenix 测试中会出现这个外键错误?
Why am I getting this foreign key error in my phoenix tests?
我在 Phoenix 进行了以下测试:
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
?
知道我做错了什么吗?
谢谢!
正如 Kalvin Hom 指出的那样,您需要查看 schema/migrations 才能理解这一点:
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
我现在可以创建订单了:)
我在 Phoenix 进行了以下测试:
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
?
知道我做错了什么吗?
谢谢!
正如 Kalvin Hom 指出的那样,您需要查看 schema/migrations 才能理解这一点:
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
我现在可以创建订单了:)