簡體   English   中英

使用Ecto和Elixir的默認日期時間

[英]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_atupdated_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM