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但是我迷失了如何正确地做它。谁能以正确的方式指出我?
当然可以。它看起来像这样:
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)