我最近一直在学习Elixir,并且想知道解决当前问题的正确语法是什么。我正在尝试使用Elixir更新模型,并且此更新包括将一个值添加到当前值(即数量=数量+ pass_amount),并将新值推入ecto数组(即事务++ new_transaction)。这是我最近的尝试:
def add_transaction(conn, %{"coin" => coin_params}) do
coin = Repo.get_by!(WalletCoin, ticker: coin_params["ticker"])
coin["transactions"] ++ coin_params["transaction"]
coin["amount"] = coin["amount"] + coin_params["amount"]
case Repo.update(coin) do
{ok, _coin} ->
coins = Repo.all(WalletCoin)
render conn, "index.json", coins: coins
end
end
我问这个问题的目的是获得答案,并希望对执行此操作的Elixir最佳实践有所了解。
预先感谢
答案 0 :(得分:0)
Elixir中的值是不可变的。您不能只为地图中的字段分配新值。您首先需要创建一个变更集,然后更改两个值:
coin =
Repo.get_by!(WalletCoin, ticker: coin_params["ticker"])
coin = coin
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_change(:transactions, coin.transactions ++ coin_params["transaction"])
|> Ecto.Changeset.put_change(:amount, coin.amount + coin_params["amount"])
现在可以使用此功能调用Repo.update
。