在 ecto 中分配 insert_at 字段

alm*_*man 6 elixir ecto

我需要测试到期时间,为此我需要分配 insert_at 字段,但是当我这样做时

insert_registration(Map.put(attrs, :inserted_at, Ecto.DateTime.cast("2016-03-11 00:00:00")))
Run Code Online (Sandbox Code Playgroud)

inserted_at 字段总是被覆盖到当前时间

Dog*_*Dog 1

确保您投入:inserted_atchangeset

所以,如果你有这样的事情:

def changeset(account, attrs) do
  account
  |> cast(attrs, [:name, :balance])
  |> validate_required([:name, :balance])
  |> unique_constraint(:name)
end
Run Code Online (Sandbox Code Playgroud)

您需要将其更改为:

def changeset(account, attrs) do
  account
  |> cast(attrs, [:name, :balance, :inserted_at])
  |> validate_required([:name, :balance])
  |> unique_constraint(:name)
end
Run Code Online (Sandbox Code Playgroud)

假设您的创建和更新上下文中有类似的内容:

def create_account(attrs \\ %{}) do
  %Account{}
   |> Account.changeset(attrs)
   |> Repo.insert()
end

def update_account(%Account{} = account, attrs) do
  account
  |> Account.changeset(attrs)
  |> Repo.update()
end
Run Code Online (Sandbox Code Playgroud)

然后您可以执行以下操作来创建:

attrs
  |> Map.put(:inserted_at, DateTime.new!(~D[2016-05-24], ~T[13:26:08.003], "Etc/UTC"))
  |> create_account()
Run Code Online (Sandbox Code Playgroud)

或更新以下内容:

update_account(account, %{ inserted_at: DateTime.new!(~D[2016-05-24], ~T[13:26:08.003], "Etc/UTC")})
Run Code Online (Sandbox Code Playgroud)