如何让表单和交易在phoenix+ecto中发挥良好?

2024-02-13

我正在玩 Phoenix + Ecto,我偶然发现了一些对我来说不习惯的东西。

我有一个代表一个表格Invitation。创建邀请函时,我们还需要创建一个User显然我希望两者都发生在一个事务中,这样我就可以保持数据的一致性。在我的表格中我要求name and email.

既然我想要Invitation在我看来,更改集可以正确地表示错误,我最终得到了这段代码......但看起来不太好。

你知道在 Phoenix + Ecto 中有更好的方法吗?

def create(params) do
  Repo.transaction(fn ->
    case Repo.insert(User.email_changeset(%User{}, params)) do
      {:ok, user} ->
        changeset = Invitation.changeset(%Invitation{}, params)
        case Repo.insert(Ecto.Changeset.change(changeset, user_id: user.id)) do
          {:ok, user} ->
            user
          {:error, changeset} ->
            Repo.rollback(changeset)
        end
      {:error, _changeset} ->
        Repo.rollback(%{Ecto.Changeset.add_error(changeset, :email, "Wrong email") | action: :insert})
    end
  end)
end

您正在寻找with操作员。这种语法的美妙之处在于,如果在任何时候你没有得到你所期望的结果,它就会停止命令链并触发你的命令。else block:

Repo.transaction(fn ->
  with {:ok, first_object} <- create_some_object,
       {:ok, second_object} <- create_another(first_object.something)  do
       second_object
  else
    {:error, error_key} ->
      Repo.rollback(error_key)
  end
end)

if create_some_object不返回与 {:ok,first_object} 匹配的结构,则永远不会创建 secondary_object。很酷,对吧?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让表单和交易在phoenix+ecto中发挥良好? 的相关文章

随机推荐

  • SpriteKit RGBA444_COMPRESSED 将屏幕尺寸加倍

    我正在 iPhone4 iOS7 1 上运行 SpriteKit 游戏 当我选择常规 RGBA888 纹理图集格式时 它看起来不错 但是 当我尝试使用 RGBA444 COMPRESSED 时 所有图集纹理的大小都会增加一倍 就好像显示器不
  • Twitter bootstrap:我需要 bootstrap-sass 和 twitter-bootstrap-rails gems 吗?

    我的 Rails 3 2 13 Gemfile 有以下条目 gem twitter bootstrap rails gem bootstrap sass 在 app assets javascripts application js 中 r
  • 在 Identity 2.1 中编写自定义 IUserPasswordStore 和 SignInManager.PasswordSignInAsync

    建立自定义IUserPasswordStore连接到旧系统的用户名 密码表 密码是用表中的自定义代码进行哈希处理的 因此我需要编写自定义代码PasswordSignInAsync 我需要覆盖吗PasswordSignInAsync或者我可以
  • 使用 SQL 从日期范围拆分/透视数据

    您好 我对拆分 枢转日期有疑问 这是我的查询 select Name Start End from Employees where Start gt 1 27 2014 and End lt 1 31 2014 样本数据会是这样的 我想要做
  • Sphinx 和 JavaScript 文档工作流程 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于我的 JavaScript 框架 我想使用 Sphinx 由于我是 Sphinx 世界的新手 我希望你们能帮助我开始使用 Sphi
  • Ruby on Rails:如何检测是否通过 JSON 访问?

    我得到了一个调用控制器方法 getInfo 的 GET URL 可以通过 mydomain com getInfo json params BLAHBLAH 或 mydomain com getInfo params BLAHBLAH 调用
  • Objective-C 中的不可变对象:大 init 方法?

    我想要一个 Objective C 中具有不可变字段的对象 在 C 中 我将使用具有私有 setter 和大型构造函数的 Properties 我会在 Objective C 中使用什么 使用 property 似乎不允许我将 setter
  • 获取该月的最后一天? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP 本月最后一天 https stackoverflow com questions 1686724 php last day of the month 有没有类似的功能 date gt getM
  • 如何在 matplotlib 中保存调整为对象大小的图形?

    大家好 我正在尝试保存 matplotlib 中的数字 它保存图形周围的空白 我的意思是它增加了空间 它不保存调整后的对象大小 在 Inkscape 中编辑它们非常容易 我在这个软件中进行编辑 但是当图形超过 50 个时 这就不太好了 我这
  • 为什么 boost::filesystem::path 和 std::filesystem::path 缺少运算符+?

    考虑以下关于路径分解的断言 其中每个局部变量例如stem有明显的初始化 例如auto stem path stem assert root path root name root directory assert path root nam
  • 谷歌地图绘制文物

    在开发我当前的项目时 我正在使用谷歌地图 我在地图上画了一些圆圈 并在缩放或移动地图后在地图上发现了一些伪影 但让我们看一下文档中的官方 Google Maps Circles 演示 谷歌地图圆圈简单 https google develo
  • 为表中的主键随机生成 1-999 之间的唯一数字

    我有一个问题 我不知道如何优雅地解决 背景资料 我有一张小部件表 每个小部件都分配有一个数字范围内的 ID 假设在 1 999 之间 1 999 的值作为 lower range 和 upper range 保存在我的数据库中名为 conf
  • 如何组合这两个 WordPress 搜索查询?

    我有两个搜索查询 人们以默认方式搜索与参数匹配的任何帖子标题 第二个查询设置为搜索帖子元键为 SKU 的任何帖子 就像搜索查询一样 我正在尝试组合这两个查询 以便搜索将返回标题或 sku 与搜索词匹配的任何帖子 第一个查询 args arr
  • Tensorboard 不再显示标量

    我决定更新张量板 因为它没有显示图表 在图表面板上我只能看到一个空白页 没有错误消息 现在我已经更新了图表 这是我的张量板显示的唯一内容 现在我看不到标量或直方图 我有 No scalar data was found 消息 直方图等也是如
  • Apache (EC2) 上的文件上传速度慢于用户的网络上传速度

    我有一个 EC2 实例 运行基本的 LAMP 堆栈作为 Web 服务器 用户可以通过我的网络应用程序上传照片 然后将其存储在目录中并记录在 MySQL 中 通常 这些上传速度与用户的互联网上传速度允许的速度一样快 不幸的是 多个用户报告有时
  • 在 Azure Functions 中将 F# 记录类型返回为 JSON

    我正在 F 中创建一个简单的 azure 函数 最后 我返回 JSON 格式的记录类型 我正在做这样的事情 let y Gender Woman Frequency 17 Percentage 100 0 req CreateRespons
  • 在使用 get 请求的 http 调用时将数组传递到 URLSearchParams

    浏览 WebAPI 文档URL搜索参数 https developer mozilla org en US docs Web API URLSearchParams 我没有找到任何有关将数组作为参数传递的文档 有人可以帮忙吗 事实上 你不能
  • 极坐标比 numpy 慢?

    我正在考虑使用polars代替numpy在一个解析问题中 我将结构化文本文件转换为字符表并对不同的列进行操作 然而 似乎polars大约慢5倍numpy在我执行的大多数操作中 我想知道为什么会出现这种情况以及我是否做错了什么polars应该
  • 依赖 NSUbiquitousKeyValueStore 存储重要数据是否安全?

    我了解到NSUbiquitousKeyValueStore总是可用的 也当没有 iCloud 帐户 https stackoverflow com a 11174855 251760已设置 这让我相信我可以安全地将重要数据存储在其中 而无需
  • 如何让表单和交易在phoenix+ecto中发挥良好?

    我正在玩 Phoenix Ecto 我偶然发现了一些对我来说不习惯的东西 我有一个代表一个表格Invitation 创建邀请函时 我们还需要创建一个User显然我希望两者都发生在一个事务中 这样我就可以保持数据的一致性 在我的表格中我要求n