Hi
,
I want to insert user and company at once (user belongs to company, company can have many users) using Ecto.Multi. Here is my current form:
<.simple_form :let={f} for={@changeset} action={~p"/users/register"}>
<.inputs_for :let={company} field={f[:company]}>
<.input field={company[:name]} type="text" label="Company" />
</.inputs_for>
<.input field={f[:email]} type="email" label="Email" required />
<.input field={f[:password]} type="password" label="Password" required />
<:actions>
<.button phx-disable-with="Creating account..." class="w-full">Create an account</.button>
</:actions>
</.simple_form>
and Ecto.Multi transaction:
def register(user_params, company_params) do
Multi.new()
|> Multi.run(:company, fn _repo, _changes ->
case Companies.create_company(company_params) do
{:ok, %{company: company}} -> {:ok, company}
{:error, :company, changeset, _} -> {:error, changeset}
end
end)
|> Multi.run(:user, fn _repo, %{company: company} ->
user_params
|> Map.put("company_id", company.id)
|> Accounts.register_user()
end)
|> Repo.transaction()
end
However if something went wrong while creating company (e.g. name was already taken) I got Company changeset, what causes an error: “could not generate inputs for :company from MyApp.Companies” (it expects User changeset). What is the most idiomatic approach in this case? I can’t use cast_assoc, since create_company is Multi transaction itself (it also invokes some additional steps).






















