如何使 Ecto Schema 中的值过期?

How to expire a value in an Ecto Schema?

假设有一个模式:

schema "players" do
  :key, :string
  :reset_key_token, :string
end

当用户想要重置他们的密钥时,在 :reset_key_token 字段中设置一个散列。这个想法是 :reset_key_token 应该放回 nil 说,一周后设置令牌。我的问题是:

是否有标准方法使 Ecto Schema 的值过期?

我已经找了一段时间了,但还没有找到关于这个主题的任何东西。但是,我发现 并想到遵循相同的想法:

1.- 添加一个 :reset_key_token_expires, Ecto.DateTime 到模式。

2.- 在读取之前(在我的例子中,我在写入之前也需要它),检查 :reset_key_token_expires 并将其设置为 nil 如果时间已经过去。

不过我想看看有没有做过的人先给个答案

感谢您的帮助!

你真的需要在到期后将值设置为nil吗?对于这个用例,您只想防止令牌在过期后被使用,我只是将该值与处理重置密钥的控制器中的当前时间进行比较。这是一些代码:

def reset_key(conn, %{"username" => username, "reset_key_token" => reset_key_token}) do
  user = Repo.get_by!(User, username: username)
  if reset_key_token == user.reset_key_token do
    case DateTime.compare(user.reset_key_token_expires, DateTime.utc_now) do
      :gt ->
        # token is still valid
      _ ->
        # token is expired
    end
  else
    # token is invalid
  end
end