使用Ecto / Elixir

时间:2018-08-29 17:19:03

标签: elixir ecto

我最近一直在学习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最佳实践有所了解。

预先感谢

1 个答案:

答案 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