使用 Ecto/Elixir 更新 Postgres table

Update Postgres table using Ecto/Elixir

我最近一直在学习 Elixir,想知道解决我当前问题的正确语法是什么。我正在尝试使用 Elixir 更新模型,此更新包括将值添加到当前值(即 amount = amount + passed_amount)并将新值推送到 ecto 数组(即 transactions ++ 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 的最佳实践。

提前致谢

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 现在应该可以了。