gpt4 book ai didi

elixir - 我应该如何管理插入相关表

转载 作者:行者123 更新时间:2023-12-02 02:16:19 25 4
gpt4 key购买 nike

我有一个链接到电子邮件表的帐户表,大致如下:

enter image description here

目前,我的帐户变更集使用 cast_assoc 来提取电子邮件:

|> cast_assoc(:emails, required: true, with: &Email.changeset(&1, &2))

但这意味着我需要提供如下数据:

%{
username: "test",
password: "secret",
emails: %{email: "test@123.com"} //<- nested
}

我正在使用 GraphQL,为了支持以下形式的“注册”突变:

register(username:"test", password:"secret", email: "test@test.com")

我需要:

  1. 重新格式化我的输入,以便将其传递到我的 ecto 变更集中(将其嵌套在电子邮件中)
  2. 平整我的变更集错误以返回验证消息

有没有办法重构它,或者修改我的变更集以取消嵌套该字段?我是 Elixir 和 ecto 的新手。

最佳答案

您的问题涉及应用程序中的不同点,因此我假设您使用的是 Phoenix >= 1.3 以及 Absinthe 。这样,我们就可以讨论您的上下文和解析器可能是什么样子。

处理传入的 GraphQL 请求涉及在到达域模块中的变更集函数之前经历两个抽象级别:首先是解析器;其次是解析器。然后是上下文模块。一个重要的良好实践是您的解析器应该只调用上下文函数。这个想法是让解析器与 Ecto 架构所在的底层域模块脱钩。

然后,您可以使用解析器来调整您的输入,使其适合您的上下文函数所期望的内容。假设您的上下文名为 Accounts,您的解析器可能看起来有点像这样:

def register(_root, %{username: username, password: password, email: email}, _info) do
args = %{username: username, password: password, emails: [%{email: email}]}

case Accounts.create_account(args) do
{:ok, %Account{} = account} ->
{:ok, account}

{:error, changeset} ->
{:error, message: "Could not register account", details: error_details(changeset)}
end
end

然后调用这个依赖 traverse_errors/2 的简单辅助函数返回所有验证消息:

defp error_details(changeset) do
changeset
|> Ecto.Changeset.traverse_errors(fn {msg, _} -> msg end)
end

关于elixir - 我应该如何管理插入相关表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50614698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com