【问题标题】:Update Postgres table using Ecto/Elixir使用 Ecto/Elixir 更新 Postgres 表
【发布时间】:2018-08-30 04:08:21
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    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 应该可以工作了。

    【讨论】:

    • 嗯,这不起作用,我需要为我的情况添加什么吗?
    • 对了。 update_change 不起作用。您可以尝试编辑的代码吗?我没有在本地设置 Ecto 进行测试,但我认为这应该可以。
    • 是的,您的答案似乎有效,因此我将其标记为答案。但是,我认为我无法添加到 :float 的数组中。你知道如何解决这个问题吗: (FunctionClauseError) no function clause matching in Ecto.Type.array/4 (ecto) lib/ecto/type.ex:896: Ecto.Type.array(4531.0, :float, #Function, [2385.0]) ?
    猜你喜欢
    • 2022-01-13
    • 2022-01-11
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多