2017-10-26 21 views
0

ユーザ自身が作成されているときに、ユーザのウォレットを作成したいとします。理想的には、トランザクション内でこれが起こることを望みます。トランザクション内:次の挿入を参照するために挿入IDを使用

私はEctoのパラダイムで、このようなものが欲しいです。

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

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

どのようにそのように達成するでしょうか?

+0

Multi.new |> Multi.insert(:albums, insert_albums(arguments)) |> Multi.run(:album_images, AlbumImage, :insert, []) |> Repo.transaction() 

どこAlbumImage.insertは、次のようになりますか? Ectoとの取引の使い方 – JustMichael

+0

2つの挿入物を 'Repo.transaction'の中に入れてください。 2番目の挿入に最初の挿入の戻り値を使用することができます。 – Dogbert

+0

インサートリターンを使用します。 IDを返すtableaに挿入します。そのIDを次の挿入に挿入し、完了しました。 –

答えて

1

Multiを使用し、最後にマルチで処理されたすべてのものをRepo.transaction()にすることを検討してください。

Ecto.Multi Multi.runは以前の計算結果を含むマルチ構造を受け入れるため、このフローを整理するのに役立ちます。なぜなら、最初の操作が失敗した場合、2番目の操作がトランザクションによって拒否されるためです同じように。

これを書き込む最も良い方法は、ビジネスオペレーションを別々の機能にすることです。ここで、2番目の機能は、以前の操作の結果の名前でMultiを受け入れます。だから何が正確に質問です

defmodule AlbumImage do 
    def insert(%{albums: albums}) do 
    # code 
    end 
end 
関連する問題