gpt4 book ai didi

database - Ecto delete many_to_many join 同时保持连接记录完整

转载 作者:搜寻专家 更新时间:2023-10-30 23:27:16 24 4
gpt4 key购买 nike

我有两个 Ecto 模型:UserSkill,它们通过 users_skillsmany_to_many 关联连接> 表:

create table(:users_skills, primary_key: false) do
add :user_id, references(:users, on_delete: :nothing)
add :skill_id, references(:skills, on_delete: :nothing)
end

create unique_index(:users_skills, [:user_id, :skill_id])

User 模式中有:

many_to_many :skills, Skill, join_through: "users_skills"

Skill 模式中有:

many_to_many :users, User, join_through: "users_skills"

我想做的是删除用户的技能而不删除 UserSkill 本身。目前我正在尝试这个:

query = Ecto.assoc(current_user, :skills)
Repo.delete_all(query)

但是它抛出错误:

(foreign_key_violation) update or delete on table "skills" violates foreign key constraint "users_skills_skill_id_fkey" on table "users_skills"

on_delete::delete_all 添加到 users_skills 迁移时,会产生删除相关技能的不良影响。

我该如何解决这个问题,以便只删除关联记录,同时 UserSkill 保持原样?

最佳答案

我确信有更好的方法可以做到这一点,但您可以将 on_replace: :delete 选项传递给您的模式中的 many_to_many 宏。

defmodule User do
use Ecto.Schema

schema "users" do
field(:name)
many_to_many(:skills, Skill, join_through: "users_skills", on_replace: :delete)

timestamps()
end
end

现在如果你跑

current_user
|> Repo.preload(:skills)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(:skills, [])
|> Repo.update!()

它从 users_skills 表中删除,skills 表将保持不变。

关于database - Ecto delete many_to_many join 同时保持连接记录完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55010292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com