2015-02-13 19 views
7

Elixir & Phoenix'i çalışmaya başladım, bugün Ecto'yu haritalayıcı olarak eklemeye çalışıyorum, ancak zaman kullanmakta sorun yaşıyorum.Ecto & Elixir ile varsayılan datetime

Bu benim modelim.

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 

Ben created_at ayarlamaya çalışırken ve varsayılan başına updated_at, ama bu derlemeye çalıştığınızda, ben aşağıdaki hatayı alıyorum ediyorum.

== 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 

Dokümantasyona girmek için çok fazla yardım yok, bunu yapmanın doğru yolu ne olurdu?

+0

Bildirimi geçtikten kendi alan adlarıyla birleştirebilirsiniz. @whatyouhide'nin dediği gibi, 'Ecto.Schema.timestamps/1' yerine. –

+0

Ecto.Schema.timestamps/1'in kullanımını nasıl ve nerede belirlerim? Sanırım tarlayı kendisi gibi göstermeyeceğim, çünkü tarlayı kendisi mi yaratıyor? – MartinElvar

+1

@whatyouhide Tekrar thx! Sana sarılmama borçluyum :-) – MartinElvar

cevap

12

:datetime, bir datetime için yerel Postgres veri türüdür; Bu veri türü iki elementli Elixir tuple ({{yy, mm, dd}, {hh, mm, ss}}) ile eşleşir. Bir %Ecto.DateTime{} yapısı iki öğeli bir tuple değil, dolayısıyla derleme hatasıdır.

Tarlalarınızın türünü Ecto.DateTime olarak ayarlamak isteyebilirsiniz, hepsi sorunsuz bir şekilde çalışmalıdır. İlkel türler ve ilkel olmayan türler hakkındaki ilgili belgelerdir.

PS da elle yazdığı için temelde ne genişler makrodur Ecto.Schema.timestamps/1 bir göz, isteyebilirsiniz (Bu created_at ve updated_at alanları ekler ve varsaymak, olması gerektiği, ne tür Diyelim seçmesine izin Ecto.DateTime):

schema "users" do 
    field :name, :string 
    field :email, :string 
    timestamps 
end 
+0

Teşekkür ederim, çok takdir ediyorum. – MartinElvar

+0

@MartinElvar sorun değil! – whatyouhide

+1

FWIW timestamps, created_at ve updated_at ekleyin, inserted_at ve updated_at [source] (http://hexdocs.pm/ecto/Ecto.Model.Timestamps.html) – engineerDave

2

Ayrıca varsayılan şema olmayabilir içermesine dikkat edin, ancak göçün olabilir: "created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"

14

varsayılan isimleriolan alanlar Ecto.DateTime.local` istediğini olmadığı derleme zamanında genişletilmiş olacak:ve :updated_at ancak bir anahtar kelime listesine `varsayılan o

schema "users" do 
    field :name, :string 
    field :email, :string 
    timestamps([{:inserted_at,:created_at}]) 
end 
+0

Nasıl geçersiz kılınır: update_at? İhtiyacım yok: tablomda update_at ancak bu zaman damgaları 'update_at' sütunlarını arar. –

+1

Bu sütunu, seçeneklerde param olarak yanlış ileterek geçersiz kılabilirsiniz, örn .: 'zaman damgaları (updated_at: false) – ontek