在 Elixir/Ecto 中,如何在给定时区将现有 naive_datetime 字段的默认值更改为现在?

In Elixir/Ecto, how do I change the default value of an existing naive_datetime field to now in a given timezone?

假设我有这个模式:

  schema "events" do
    field :start, :naive_datetime
  end

我想将 start 字段的默认值设置为大致 /events/new 页面加载的时间(“现在”)。让我们忽略用户通常不希望事件实际上立即开始的反对意见,并假设我们提前知道应该评估“现在”的时区(例如,“US/Mountain”)。

您可以在变更集级别执行此操作。

def create_changeset(event, attrs) do
 event
 |> cast(attrs, [:start])
 |> put_start()
end

def put_start(%{changes: %{start: _start}} = changeset), do: changeset

def put_start(changeset) do
 changeset
 |> put_change(:start, current_time(timezone))
end