我在变更集管道中具有加密令牌的功能。
def changeset(user, params \\ %{}) do
user
|> cast(params, [:id, :token]
|> encrypt(:token)
end
由于此功能是新功能,因此旧数据仍未加密,因此我需要手动进行操作。然后我遇到了问题。
如果我将原始token
传递给changeset,它将把值当作没有变化。管道中的encrypt
无法正常工作,值也无法更新。
如果我对token
进行了加密并传递给changeset,则它将其标记为更改,并应用了encrypt
函数。但是,它加密了twice
。
一种笨拙的方法是在encrypt
上添加检查以检查token
是否已加密。但是请记住,在将新令牌传递到变更集之前,我们仍然需要检查令牌是否已加密。也就是说,我们要进行两次检查。
因此,如果有人有想法,我正在寻找一种简单的解决方案。
欢呼
答案 0 :(得分:1)
由于这是一个一次性操作,因此我将进行迁移,该迁移将直接调用Ecto.Repo.update/2
(不幸的是,除非您可以执行{{1 }}直接在数据库中。)
encrypt
边注:,您还可以看看Ecto.Repo.update_all/3
的后续情况。