Dans mon application Phoenix je les schémas suivants:Ecto.Multi ussage
defmodule TattooBackend.Accounts.Account do
schema "accounts" do
field :email, :string
field :crypted_password, :string
field :password, :string, virtual: true
field :password_confirmation, :string, virtual: true
timestamps()
end
end
defmodule TattooBackend.Accounts.Studio do
schema "studios" do
field :name, :string
belongs_to :account, Account
timestamps()
end
end
Maintenant, je suis en train d'écrire du code pour insérer compte et le Studio à la base de données en une seule transaction. J'utilise Ecto.Multi pour cela. Mon code ressemble à ceci:
multi = Multi.new |>
Multi.insert(:account, Account.changeset(%Account{}, %{email: "[email protected]", password: "password", password_confirmation: "password"})) |>
Multi.run(:studio, fn %{account: account} ->
studio_changeset = Studio.changeset(%Studio{}, %{name: "test", account_id: account.id})
Repo.insert(studio_changeset)
end)
Repo.transaction(multi)
Ce code fonctionne parfaitement bien, mais je me demande s'il y a un endroit pour le rendre meilleur. Je suis encore assez nouveau à Elixir donc je veux savoir si quelque chose peut être fait de meilleure façon. Merci d'avance.
Y a-t-il une raison particulière pour laquelle vous utilisez 'Multi.run/3' au lieu d'un' Multi.insert/4'? –
@JustinWood J'ai utilisé Multi.run parce que j'ai besoin de mettre à jour la valeur de modification du compte de Studio après la création du compte. Ou peut-être y at-il moyen de le faire en utilisant Multi.insert? –
Vous avez raison. Je n'ai pas réalisé que vous ne pouviez pas obtenir les changements en cours avec 'Multi.insert/4'. –