更新Ecto中的现有数据时,我应该使用变更集吗?

时间:2019-08-28 02:31:16

标签: elixir phoenix-framework ecto

我在变更集管道中具有加密令牌的功能。

def changeset(user, params \\ %{}) do
  user
  |> cast(params, [:id, :token]
  |> encrypt(:token)
end

由于此功能是新功能,因此旧数据仍未加密,因此我需要手动进行操作。然后我遇到了问题。

如果我将原始token传递给changeset,它将把值当作没有变化。管道中的encrypt无法正常工作,值也无法更新。

如果我对token进行了加密并传递给changeset,则它将其标记为更改,并应用了encrypt函数。但是,它加密了twice

一种笨拙的方法是在encrypt上添加检查以检查token是否已加密。但是请记住,在将新令牌传递到变更集之前,我们仍然需要检查令牌是否已加密。也就是说,我们要进行两次检查。

因此,如果有人有想法,我正在寻找一种简单的解决方案。

欢呼

1 个答案:

答案 0 :(得分:1)

由于这是一个一次性操作,因此我将进行迁移,该迁移将直接调用Ecto.Repo.update/2(不幸的是,除非您可以执行{{1 }}直接在数据库中。)

encrypt

边注:,您还可以看看Ecto.Repo.update_all/3的后续情况。