在事务中:使用inserted id作为对下一次插入的引用

时间:2017-10-26 11:51:00

标签: postgresql elixir ecto

我想在创建用户本身时为用户创建钱包。理想情况下,我希望在事务中发生这种情况,因为没有另一个事务可能不存在。

在Ecto范例中,我想要这样的东西。

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (lastval(), image_id) [...];
COMMIT;

取自https://github.com/elixir-ecto/ecto/issues/2154

如何实现这样的目标?

1 个答案:

答案 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