Ecto delete many_to_many 加入,同时保持加入的记录完整
Ecto delete many_to_many join whilst keeping joined records in tact
我有两个 Ecto 模型:User
和 Skill
,它们通过 users_skills
table:[=28 与 many_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"
我想做的是删除用户的技能而不删除 User
或 Skill
本身。目前我正在尝试这个:
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
迁移时,会产生删除相关技能的不良影响。
我该如何处理才能只删除关联记录,同时 User
和 Skill
保持原状?
我相信有更好的方法可以做到这一点,但您可以将 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
中删除 table 并且 skills
table 将保持不变。
我有两个 Ecto 模型:User
和 Skill
,它们通过 users_skills
table:[=28 与 many_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"
我想做的是删除用户的技能而不删除 User
或 Skill
本身。目前我正在尝试这个:
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
迁移时,会产生删除相关技能的不良影响。
我该如何处理才能只删除关联记录,同时 User
和 Skill
保持原状?
我相信有更好的方法可以做到这一点,但您可以将 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
中删除 table 并且 skills
table 将保持不变。