[英]Default datetime with Ecto & Elixir
我今天剛剛開始使用Elixir和Phoenix,我試圖將Ecto添加為映射器,但是我在使用時間時遇到了一些麻煩。
這是我的模特。
schema "users" do
field :name, :string
field :email, :string
field :created_at, :datetime, default: Ecto.DateTime.local
field :updated_at, :datetime, default: Ecto.DateTime.local
end
我試圖在默認情況下設置created_at和updated_at,但是當我嘗試編譯它時,我收到以下錯誤。
== Compilation error on file web/models/user.ex ==
** (ArgumentError) invalid default argument `%Ecto.DateTime{day: 13, hour: 19, min: 47, month: 2, sec: 12, year: 2015}` for `:datetime`
lib/ecto/schema.ex:687: Ecto.Schema.check_default!/2
lib/ecto/schema.ex:522: Ecto.Schema.__field__/4
web/models/board.ex:9: (module)
(stdlib) erl_eval.erl:657: :erl_eval.do_apply/6
獲取文檔沒有太大幫助,這樣做的正確方法是什么?
默認字段名稱為:inserted_at
和:updated_at
但您可以合並自己的字段名稱,並傳遞關鍵字列表
schema "users" do
field :name, :string
field :email, :string
timestamps([{:inserted_at,:created_at}])
end
:datetime
是本機Postgres數據類型,以及日期時間; 此數據類型映射到兩個元素的Elixir元組( {{yy, mm, dd}, {hh, mm, ss}}
)。 %Ecto.DateTime{}
結構不是兩元素元組,因此編譯錯誤。
您可能希望將字段類型設置為Ecto.DateTime
,它應該都可以無縫地工作。
以下是有關基本類型和非基本類型的相關文檔。
PS你可能還想看看Ecto.Schema.timestamps/1
,它是宏,它基本上擴展到你手動編寫的內容(它添加了created_at
和updated_at
字段,它讓你選擇它們應該是什么類型,默認為Ecto.DateTime
):
schema "users" do
field :name, :string
field :email, :string
timestamps
end
您還可以考慮讓默認值不在架構中,但在遷移中: "created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.