使用 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
现在应该可以了。
我最近一直在学习 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
现在应该可以了。