Elixir Ecto-如何升级/递增

use*_*306 3 elixir ecto phoenix-framework

我有一个要在Phoenix / Elixir中执行的模型。该模型基本上计算用户花费的金额的总和。模型(Receipts)如下所示:

---------------
| ID | Amount |
---------------
| 1  |   0    |
| ...|  ...   |
| 5  |   4    |
---------------
Run Code Online (Sandbox Code Playgroud)

上有一个唯一索引ID。我想将用户插入表中(我定义ID),然后在用户不存在的情况下设置金额,否则将新金额添加到现有金额中。例如,执行:

Repo.insert(Users.changeset(%Users{}, %{ID: 1, Amount: 10})
Run Code Online (Sandbox Code Playgroud)

将导致:

---------------
| ID | Amount |
---------------
| 1  |   11   |
| ...|  ...   |
| 5  |   4    |
---------------
Run Code Online (Sandbox Code Playgroud)

并执行Repo.insert(%Users {},Users.changeset(%{ID:6,Amount:5})将导致:

---------------
| ID | Amount |
---------------
| 1  |   11   |
| ...|  ...   |
| 5  |   4    |
| 6  |   5    |
---------------
Run Code Online (Sandbox Code Playgroud)

我知道我应该做些事情,:on_conflict但是我迷失了如何正确地做它。谁能以正确的方式指出我?

sto*_*ack 7

当然可以。它看起来像这样:

iex> amount_to_add = 10
10
iex> Repo.get(User, 1)
nil
iex> Repo.insert(%User{id: 1, amount: amount_to_add}, conflict_target: :id, on_conflict: [inc: [amount: amount_to_add]])
...
iex> Repo.get(User, 1)
%User{id: 1, amount: 10, ...}
iex> Repo.insert(%User{id: 1, amount: amount_to_add}, conflict_target: :id, on_conflict: [inc: [amount: amount_to_add]])
...
iex> Repo.get(User, 1)
%User{id: 1, amount: 20, ...}
Run Code Online (Sandbox Code Playgroud)