Skip to content

Instantly share code, notes, and snippets.

@ntilwalli
Last active March 24, 2018 19:13
Show Gist options
  • Select an option

  • Save ntilwalli/a0acddec1591622226622b50f1483543 to your computer and use it in GitHub Desktop.

Select an option

Save ntilwalli/a0acddec1591622226622b50f1483543 to your computer and use it in GitHub Desktop.
Ecto preloading within transaction
# create table(:invites) do
# add :foo_id, references(:foo, on_delete: :delete_all), null: false
# add :to_id, references(:users, on_delete: :delete_all), null: true
# add :status, :string
# end
# create table(:holders) do
# add :foo_id, references(:foo, on_delete: :delete_all), null: false
# add :user_id, references(:users, on_delete: :delete_all), null: true
# add :invite_id, referendes(:invites, on_delete: :delete_all)
# end
# defmodule Shared.Invite do
# schema "invites" do
# field :status, :string
# belongs_to :foo, Shared.Foo
# belongs_to :to, Shared.User
# has_one :holder, Shared.Holder, foreign_key: :invite_id
# end
# end
# defmodule Shared.Holder do
# schema "holders" do
# belongs_to :role, Shared.Foo
# belongs_to :user, Shared.User
# belongs_to :invite, Shared.Invite
# end
# end
# Create some valid invite
%Shared.Invite{...} = invite
# Then check if preloading possible
Shared.Repo.transaction(fn ->
cs = Ecto.Changeset.change(invite, status: @accepted)
case Shared.Repo.update(cs) do
{:ok, invite} ->
cs = Shared.ListingRoleHolder.changeset(%Shared.ListingRoleHolder{}, %{user_id: invite.to_id, role_id: invite.role_id, requester_id: invite.to_id, invite_id: invite.id})
case Shared.Repo.insert(cs) do
{:ok, holder} ->
invite = Shared.Repo.preload(invite, [:holder], force: true)
assert(!invite.holder)
_ -> Shared.Repo.rollback({:error, :could_not_insert_holder})
end
_ -> Shared.Repo.rollback({:error, :could_not_update_invite})
end
end)
Shared.Repo.preload(invite, [:holder], force: true)
assert(invite.holder) # Loaded fine
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment