2015-02-13 11 views
7

के साथ डिफ़ॉल्ट डेटाटाइम मैंने अभी एलीक्सिर & फीनिक्स काम करना शुरू कर दिया है, मैं एक्टो को मैपर के रूप में जोड़ने की कोशिश कर रहा हूं, लेकिन मुझे समय का उपयोग करने में कुछ परेशानी हो रही है।एक्टो और एलिक्सीर

यह मेरा मॉडल है।

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 

दस्तावेज़ीकरण में बहुत मदद नहीं है, ऐसा करने का सही तरीका क्या होगा?

+0

सूचना है कि 'डिफ़ॉल्ट: Ecto.DateTime.local' संकलन समय में विस्तार करने की है जो नहीं है तुम क्या चाहते हो रहा है। @whatyouhide के रूप में, इसके बजाय 'Ecto.Schema.timestamps/1' का उपयोग करें। –

+0

मैं Ecto.Schema.timestamps/1 के उपयोग को कैसे और कहां निर्दिष्ट करूं? मुझे लगता है कि मैं इसे एक क्षेत्र के रूप में नहीं कहूंगा, क्योंकि यह खेतों को ही बनाता है? – MartinElvar

+1

@whatyouhide फिर से thx! मैं तुम्हें गले लगाता हूं :-) – MartinElvar

उत्तर

12

:datetime देशी पोस्टग्रेस डेटा प्रकार, अच्छी तरह से डेटाटाइम है; यह डेटा दो तत्वों Elixir tuple ({{yy, mm, dd}, {hh, mm, ss}}) के लिए नक्शे टाइप करता है। एक %Ecto.DateTime{} संरचना दो-तत्व tuple नहीं है, इसलिए संकलन त्रुटि।

आप अपने फ़ील्ड के प्रकार को Ecto.DateTime पर सेट करना चाहते हैं, यह सभी को निर्बाध रूप से काम करना चाहिए।

Here आदिम प्रकारों और गैर-आदिम प्रकारों के बारे में प्रासंगिक दस्तावेज है।

पुनश्च आप भी Ecto.Schema.timestamps/1 पर एक नज़र है, जो मैक्रो जो विस्तृत होने के लिए मूल रूप से क्या आप मैन्युअल रूप से लिखा है के लिए चाहते हो सकता है (यह created_at और updated_at क्षेत्रों कहते हैं और यह कि वे किस प्रकार किया जाना चाहिए की आपको चुन सकते हैं, करने के लिए दोषी Ecto.DateTime):

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

धन्यवाद, बहुत सराहना की। – MartinElvar

+0

@MartinElvar कोई समस्या नहीं! – whatyouhide

+1

FWIW टाइमस्टैम्प create_at को जोड़ता नहीं है और अपडेट किया गया है इसे विज्ञापन डाला गया_एट और अपडेट किया गया [स्रोत] (http://hexdocs.pm/ecto/Ecto.Model.Timestamps.html) – engineerDave

2

तुम भी होने डिफ़ॉल्ट स्कीमा में नहीं हो विचार कर सकते हैं, लेकिन प्रवास में: "created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"

14

चूक फ़ील्ड नामहैंऔर :updated_at लेकिन आप अपने खुद के क्षेत्र नामों के साथ विलय कर सकते हैं, एक कीवर्ड सूची गुजर

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

ओवरराइड कैसे करें: update_at? मुझे इसकी आवश्यकता नहीं है: मेरी तालिका में update_at लेकिन यह टाइमस्टैम्प 'update_at' कॉलम ढूंढता है। –

+1

आप विकल्पों में एक पैरा के रूप में झूठी गुजरकर उस कॉलम को ओवरराइड कर सकते हैं, उदाहरण: 'टाइमस्टैम्प (अपडेट_ट: झूठा)' – ontek