我有主要数据和详细数据。我想一次插入两者。
-------
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()
详细信息插入中的零件不起作用。我该怎么办?
子项的插入不起作用由于交易。尝试插入Detail
时,父级不存在。
通常使用Ecto.build_assoc/3
插入相关记录,或者[不推荐!],您可能会摆脱该事务并通过两个查询将它们一个接一个地插入-这会起作用。
[我认为您的示例与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进行交互。