如何使用 Ecto 设置 foreign_key_constraint 删除模型?
How can I set up foreign_key_constraint on model deletion with Ecto?
我有 2 个模型,User
和 Role
。 User
has_many
Roles
。我也设置了外键约束(如果有任何用户拥有这个角色,你不能删除角色)。
我在尝试实施时遇到错误
Role
|> Repo.get(id)
|> Repo.delete
错误是:
** (Ecto.ConstraintError) constraint error when attempting to delete struct:
* foreign_key: users_role_id_fkey
If you would like to convert this constraint into an error, please
call foreign_key_constraint/3 in your changeset and define the proper
constraint name. The changeset defined the following constraints:
* foreign_key: roles_users_fkey
我不知道如何在删除时添加 foreign_key_constraint
。我试着自己写,比如:
def delete_changeset(struct) do
struct
|> cast(%{}, [])
|> foreign_key_constraint(:users)
end
并插入到|> Repo.delete
之前。但它不起作用。如何在此处添加 foreign_key_constraint
?
更新
迁移文件:
defmodule MyApp.Repo.Migrations.CreateRole do
use Ecto.Migration
def change do
create table(:roles) do
add :name, :string, null: false
timestamps()
end
create unique_index(:roles, [:name])
end
end
添加 role_id
用户:
defmodule MyApp.Repo.Migrations.AddRoleIdToUsers do
use Ecto.Migration
def up do
alter table(:users) do
add :role_id, references(:roles, on_delete: :nothing)
remove :role
end
end
end
我通过
解决了
|> foreign_key_constraint(:users, name: :users_role_id_fkey)
正在删除变更集。但它returns 可怕的错误
%{ "users" => ["doesn't exist"] }
在变更集中。我勒个去?我想在变更集中纠正错误
Role
|> Repo.get(id)
|> Ecto.Changeset.change
|> Ecto.Changeset.no_assoc_constraint(:users)
|> Repo.delete
我有 2 个模型,User
和 Role
。 User
has_many
Roles
。我也设置了外键约束(如果有任何用户拥有这个角色,你不能删除角色)。
我在尝试实施时遇到错误
Role
|> Repo.get(id)
|> Repo.delete
错误是:
** (Ecto.ConstraintError) constraint error when attempting to delete struct:
* foreign_key: users_role_id_fkey
If you would like to convert this constraint into an error, please
call foreign_key_constraint/3 in your changeset and define the proper
constraint name. The changeset defined the following constraints:
* foreign_key: roles_users_fkey
我不知道如何在删除时添加 foreign_key_constraint
。我试着自己写,比如:
def delete_changeset(struct) do
struct
|> cast(%{}, [])
|> foreign_key_constraint(:users)
end
并插入到|> Repo.delete
之前。但它不起作用。如何在此处添加 foreign_key_constraint
?
更新
迁移文件:
defmodule MyApp.Repo.Migrations.CreateRole do
use Ecto.Migration
def change do
create table(:roles) do
add :name, :string, null: false
timestamps()
end
create unique_index(:roles, [:name])
end
end
添加 role_id
用户:
defmodule MyApp.Repo.Migrations.AddRoleIdToUsers do
use Ecto.Migration
def up do
alter table(:users) do
add :role_id, references(:roles, on_delete: :nothing)
remove :role
end
end
end
我通过
解决了|> foreign_key_constraint(:users, name: :users_role_id_fkey)
正在删除变更集。但它returns 可怕的错误
%{ "users" => ["doesn't exist"] }
在变更集中。我勒个去?我想在变更集中纠正错误
Role
|> Repo.get(id)
|> Ecto.Changeset.change
|> Ecto.Changeset.no_assoc_constraint(:users)
|> Repo.delete