Hey,
Here is my little multi:
case attrs do
%{"default" => "true"} ->
Multi.new()
|> Multi.update_all(:set_default_to_false, VATType, set: [default: false])
_ ->
Multi.new()
end
|> Multi.update(:update_vat_type, VATType.changeset(vat_type, attrs))
|> Multi.run(:no_default, fn repo, _ ->
IO.inspect(get_by_id(vat_type.id))
case repo.get_by(VATType, default: true) do
%VATType{} = _vat_type ->
{:ok, :present}
x ->
IO.inspect(x)
{:error, VATType.changeset_error(:default, "no default", vat_type)}
end
end)
|> Repo.transaction()
What confuses me is the following:
I update all the items’ default value to false, and then I update the current one as default, to ensure only one is default at any time.
When I get the item to do the check in the run, what state am I getting?
It is not the db, because in the db I am seeing true and here false.
But if I am setting from false to true I am still seeing false here.
Could someone shed some light on this?
The weird behavior happens once my update fails and I retry.
I thought that queries inside the multi return the state inside the multi, is this correct?
With this multi shouldn’t I be getting the result of the single update always?
EDIT:
If I explicitly omit the item in question from the update_all step then it works as expected.