我试图删除一个项目及其所有子项:
where(ParentModel, [x], x.user_id == 123)
|> first
|> Repo.delete()
# or
# Repo.delete(where(ParentModel, [x], x.user_id == 123))
两者都抛出异常:
function Ecto.Query.__changeset__/0 is undefined or private
与验证有什么关系?
在父模型中,我有on_delete: :delete_all
答案 0 :(得分:4)
将first()
替换为Repo.one!()
或Repo.delete_all()
。 Ecto.Query.first()
返回一个查询,但Repo.delete()
需要模型的结构或变更集。如果你传递一个查询,它就会感到困惑。
使用Repo.one!()
,您首先获取结构,然后将其传递给Repo.delete()
,Repo.delete()
可以使用该结构。
Repo.delete_all()
可以进行查询,但会直接删除与查询匹配的任何内容。所以要小心。