final version
def create_recording(attrs \\ %{}) do
Ecto.Multi.new()
|> Ecto.Multi.insert(:recording, Recording.changeset(%Recording{}, attrs))
|> Ecto.Multi.update(:recording_with_audio, &Recording.audio_changeset(&1.recording, attrs))
|> Repo.transaction()
|> case do
{:ok, %{recording_with_audio: recording}} -> {:ok, recording}
{:error, _operation, changeset, _} ->
# make the form to a "new" state insted of "update"
# https://github.com/phoenixframework/phoenix_ecto/blob/master/lib/phoenix_ecto/html.ex#L300
meta = Map.put(changeset.data.__meta__, :state, nil)
data = Map.put(changeset.data, :__meta__, meta)
Map.put(changeset, :data, data)
|> Ecto.Changeset.apply_action(:insert)
end
end






















