我们可以根据用户在Repo.delete!(changeset)条件下在elixir和phoenix Web开发中的电子邮件地址来限制从数据库中删除用户的情况
现在是我正在使用的代码。我想在删除期间限制从数据库中删除两个用户:-
def delete(conn, _params, current_admin) do
changeset = AdminUser.common_changeset(conn.assigns.admin_user, %{}, whodoneit(current_admin))
Repo.delete!(changeset)
msg = gettext("%{name} deleted successfully", name: gettext("Administrator"))
conn
|> put_flash(:success, msg)
|> redirect(to: Routes.admin_admin_user_path(conn, :index))
end
尽管防止对某些“记录记录”执行操作的正确方法是更改数据库以拒绝此类修改(请参见下文),但仍然可以使用Ecto.Changeset.validate_change/3
及其更详细的同级Ecto.Changeset.validate_change/3
来实现此结果。那里的示例显示了如何防止基于值验证某些变更集。
更通用的方法是在委派给默认的Ecto.Changeset.validate_exclusion/4
之前,实现Ecto.Changeset.validate_exclusion/4
(和Ecto.Repo.delete/2
)回调以检查值>
Ecto.Repo.delete/2
它仍然很容易出错,因为可能只是通过Ecto.Repo.delete!/2
执行原始查询>
Ecto.Repo.delete!/2
此外,有人可能会修改
电子邮件,在这种情况下,您想避免使用Ecto.Repo.Schema.delete/4
。
也就是说,唯一正确的方法是依靠数据库拒绝此类删除。可以使用Ecto.Repo.Schema.delete/4
或PostgreSQL中的@impl Ecto.Repo
def delete(struct, opts \\ []) do
# check the record and execute the code below
# if and only if the check passed
Ecto.Repo.Schema.delete(
__MODULE__,
get_dynamic_repo(),
struct,
with_default_options(:delete, opts)
)
end
完成。这将是触发示例。
Ecto.Adapters.SQL.query/4