我有一个用户结构,该结构可以有多个帐户(has_many),并且可以通过该帐户在多个团队中(很多到很多),如下所示:
schema "user" do
...
has_many :accounts, Account
many_to_many(
:teams,
Team,
join_through: Account
)
timestamps()
end
由于我正在为应用程序的所有实体建立基本的CRUD操作,因此我需要告诉用户为什么他不能删除其用户(因为仍然有关联的帐户)。但是,如果不尝试捕捉这种方式,我将找不到一种方法:
try do
Repo.delete(user)
rescue
Ecto.ConstraintError ->
{:error, "In order to delete an user, you must first delete it's associated accounts"}
end
但这是不好的,原因有两个,首先是我们在应用程序中尝试catch(或erlang world)所使用的标准不规范,其次是如果我的任何一个实体中都有多个外部约束,无法确定其中哪个导致了错误。
我尝试了文档中提供的所有可能方法,例如:
删除时:
Repo.get(User, user.id)
|> Ecto.Changeset.change
|> Ecto.Changeset.no_assoc_constraint(:accounts)
|> Repo.delete()
关于变更集验证:
user
|> Ecto.Changeset.no_assoc_constraint(:accounts)
user
|> foreign_key_constraint(:accounts, name: "johan_sports_team_users_user_id_9294a0f7_fk_auth_user_id")
我尝试了许多变体,但似乎无济于事,最终我总是得到:
尝试删除结构时**(Ecto.ConstraintError)约束错误:
* johan_sports_team_users_user_id_9294a0f7_fk_auth_user_id (foreign_key_constraint)
If you would like to stop this constraint violation from raising an
exception and instead add it as an error to your changeset, please
call `foreign_key_constraint/3` on your changeset with the constraint
`:name` as an option.
The changeset has not defined any constraint.
有人知道这个更好的解决方案吗?