複数の並行タスクがあり、すべてがレコード存在をチェックしようとしています。並行タスクの処理
残念ながら、私はすべてのタスクが同時にレコードが存在しないと判断してから、すべてが挿入されると判断しているように、レコードをDBに書き込むことになります。
目的の動作は、挿入を1回だけ取得してから、他のタスクが挿入されたばかりのレコードの存在を認識することです。すべてのヘルプは高く評価され
alias MyApp.Parent, as: Parent
alias MyApp.Repo, as: Repo
changeset = Parent.changeset(%Parent{}, model)
case Repo.all(from p in Parent, where: p.mobile_number == ^model.mobile_number) do
[] ->
#does not exist
case Repo.insert_or_update(changeset) do
{:ok, %MyApp.Parent{ id: parent_id }} -> parent_id
error_message -> nil
end
[parent_get_by|t] ->
#already exist
%MyApp.Parent{ id: parent_id }= parent_get_by
parent_id
end
:
は、ここに私の試みです!
ですから、エラーが発生した場合、私は 'mobile_number'を使って読み込みますか? – simo
既存のレコードを取得したい場合は、後で 'Repo.get_by(Parent、mobile_number:model.mobile_number)'を実行することができます。 – Dogbert
'insert_or_update'の使用はどうですか?既存のレコードに 'get_by'を使用するよりも、レコードが存在していればそれが更新されます。 – simo