如何通过ecto一次插入主要和详细数据

问题描述 投票:1回答:2

我有主要数据和详细数据。我想一次插入两者。

-------
 main
-------
 id
 name
-------

---------
 detail
---------
 id
 main_id
 name
---------

我正在使用ecto的多笔交易。但是我不知道如何立即插入。

main = [name: "zaku"]
details = [%{main_id: 1, name: "hoge"}, %{main_id: 1, name: "moja"},]

Multi.new()
  |> Multi.insert(:main, Main.changeset(%Main{}, main))
  |> Multi.insert(:detail, Detail.changeset(%Detail{}, details))
  |> Repo.transaction()

详细信息插入中的零件不起作用。我该怎么办?

elixir phoenix-framework ecto
2个回答
2
投票

子项的插入不起作用由于交易。尝试插入Detail时,父级不存在。

通常使用Ecto.build_assoc/3插入相关记录,或者[不推荐!],您可能会摆脱该事务并通过两个查询将它们一个接一个地插入-这会起作用。


0
投票

[我认为您的示例与Ecto.build_assoc/3类似,您只需通过调用the solution for your other example函数来关闭多个查询:

transaction/1

就个人而言,我认为alias Ecto.Multi alias Ecto.Repo user = get_user_params_from_form() # <-- or where-ever you are getting data email = get_email_params_from_form() Multi.new() |> Multi.insert(:user, User.changeset(%User{}, user)) |> Multi.insert( :email, # Capture the id from the previous operation fn %{ user: %User{ id: user_id } } -> Email.changeset(%Email{user_id: user_id}, email) end ) |> Repo.transaction() 的使用并不容易,因此有时我更喜欢其他语法,您可以在其中将函数传递给Multi。松散地,看起来像这样:

Repo.transaction/2 callback

应该指出,此模式可用于包装事务中的任何任务。例如。例如,如果“ thing2”要与第三方API进行交互。

© www.soinside.com 2019 - 2024. All rights reserved.