我想在创建用户本身时为用户创建钱包。理想情况下,我希望在事务中发生这种情况,因为没有另一个事务可能不存在。
在Ecto范例中,我想要这样的东西。
BEGIN;
INSERT INTO albums [...];
INSERT INTO album_images (lastval(), image_id) [...];
COMMIT;
取自https://github.com/elixir-ecto/ecto/issues/2154。
如何实现这样的目标?
答案 0 :(得分:1)
考虑使用Multi
,最后您将把Multi中处理的所有内容都放到Repo.transaction()
。
Ecto.Multi将帮助您组织此流程,因为Multi.run接受包含先前计算结果的Multi结构 - 这就是您可以安全使用它的原因,因为如果第一次操作失败,则第二次一个人也将被交易拒绝。
编写它的最佳方法是将业务操作放在单独的函数中,其中第二个函数接受Multi与前一操作的结果名称。
Multi.new
|> Multi.insert(:albums, insert_albums(arguments))
|> Multi.run(:album_images, AlbumImage, :insert, [])
|> Repo.transaction()
AlbumImage.insert
可能如下所示:
defmodule AlbumImage do
def insert(%{albums: albums}) do
# code
end
end