How to express a default value that changes over time in ecto schema?
schema "table" do
field(:last_interaction, :utc_datetime, default: &DateTime.utc_now/0)
end
causes a runtime error
** (Ecto.ChangeError) value `&DateTime.utc_now/0` for `Resource.last_interaction` in `insert` does not match type :utc_datetime
(ecto) lib/ecto/repo/schema.ex:789: Ecto.Repo.Schema.dump_field!/6
(ecto) lib/ecto/repo/schema.ex:798: anonymous fn/6 in Ecto.Repo.Schema.dump_fields!/5
(stdlib) lists.erl:1263: :lists.foldl/3
(ecto) lib/ecto/repo/schema.ex:796: Ecto.Repo.Schema.dump_fields!/5
(ecto) lib/ecto/repo/schema.ex:745: Ecto.Repo.Schema.dump_changes!/6
(ecto) lib/ecto/repo/schema.ex:208: anonymous fn/14 in Ecto.Repo.Schema.do_insert/4
(ecto) lib/ecto/repo/schema.ex:125: Ecto.Repo.Schema.insert!/4
schema "table" do
field(:last_interaction, :utc_datetime, default: fn -> DateTime.utc_now() end)
end
doesn’t compile
== Compilation error in file .../resource.ex ==
** (ArgumentError) cannot escape #Function<1.89618492 in file:.../resource.ex>. The supported values are: lists, tuples, maps, atoms, numbers, bitstrings, PIDs and remote functions in the format &Mod.fun/arity
(elixir) src/elixir_quote.erl:114: :elixir_quote.argument_error/1
(elixir) src/elixir_quote.erl:227: :elixir_quote.do_quote/3
(elixir) src/elixir_quote.erl:402: :elixir_quote.do_splice/5
(elixir) src/elixir_quote.erl:136: :elixir_quote.escape/2
(elixir) lib/macro.ex:375: Macro.escape/2
lib/ecto/schema.ex:1677: Ecto.Schema.__defstruct__/1
.../resource.ex:19: (module)
schema "table" do
field(:last_interaction, :utc_datetime, default: DateTime.utc_now())
end
returns the datetime of compilation.