尝试删除has_many关联中的结构时检查外键约束

时间:2019-03-06 22:07:57

标签: elixir phoenix-framework ecto

我有一个用户结构,该结构可以有多个帐户(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.

有人知道这个更好的解决方案吗?

0 个答案:

没有答案