【问题标题】:How to use multiple changesets at the same page如何在同一页面上使用多个变更集
【发布时间】:2020-04-10 18:10:02
【问题描述】:

我必须同时更新 3 个表。 一页有 3 个变更集。

如果我使用form_for 发布 3 个 chagnesets,我该如何编写代码? 以下是 3 个表。

---------
 members
---------
id
name

----------------
 member_details  
----------------
member_id
address
phone_no

--------------
 member_items
--------------
member_id
item_id

或者另一种方式会受到欢迎。

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    假设您希望表全部更新或不更新,这需要一个事务。 Ecto.Multi 的完美用例。有the example,您可以直接申请。

    要将传入的参数分成三组,可能会使用Map.take/2

    【讨论】:

    • 可能我需要知道如何使changeset 用于在new actionnew.html.eex 中进行预设。我正在尝试,但我不知道。
    • 我可能需要像Xxx.changet(xxx, %{}) 一样为 3 张桌子制作。
    • 我不关注。创建变更集的时间并不重要——它总是以相同的方式完成,您的模式接受params(我上面说过的拆分器)并生成一个变更集,如everywhere in docs所示)。
    • 我可能需要像Xxx.changet(xxx, %{}) 一样为 3 张桌子制作。 没错。我在这里没有看到任何问题。
    • 我的问题是如何在@changeset 中为form_for 的参数提供3 个变更集。或者如何在 changeset 中设置 3 个变更集。
    【解决方案2】:

    我遇到了和你类似的问题。您不需要 3 个变更集。您需要的是一个 embedded_schema,其中包含您要插入的 3 个顶部元素。然后,当您提交表单时,您可以调用与您尝试插入的元素相对应的每个变更集。最后,您在 other 中使用 Ecto.Multi 或 Repo.transaction 使此操作全部失败或全部成功。查看有关其工作原理的架构文档的顶部描述(特别是 SignUp 示例)。 https://hexdocs.pm/ecto/Ecto.Schema.html

    【讨论】:

    • 我的问题是如果我从上一页使用表单create(conn, %{"xxx" => params}) 获取参数,我需要使用表单f。但是,如果我用create(conn, params) 获得带有3 个变更集的参数,我不知道如何插入数据库。
    • 假设您创建了一个嵌入式架构group,其中包含membermember_detailsmember_items。在您的控制器中,您在create(conn, %{"group" => group} = params) 上进行模式匹配。接下来要做的是调用每个变更集,例如:MemberItems.changeset(%MemberItem{}, group["member_items"])... 然后使用事务将它们全部插入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2019-01-06
    • 2022-06-10
    • 2019-09-30
    相关资源
    最近更新 更多