ecto

2015-09-08 8 views
25

में फ़ील्ड अद्वितीय बनाने के लिए ecto में unique फ़ील्ड कैसे बनाएं?ecto

मैंने सोचा कि यह रूबी में सक्रिय रिकॉर्ड के रूप में ही है, लेकिन यह यह

उत्तर

50

आप unique_constraint/3 उपयोग करना चाहते हैं नहीं है लगता है। यह सक्रिय रिकॉर्ड की तरह नहीं है क्योंकि यह विशिष्टता सुनिश्चित करने के लिए डेटाबेस का उपयोग कर रहा है। सक्रिय रिकॉर्ड उसी मान के साथ रिकॉर्ड के लिए एक क्वेरी करेगा और यदि कोई वापस लौटाया गया तो यह असफल हो जाएगा। इसमें एक दौड़ की स्थिति है, जहां विशिष्टता की जांच करने और अपना रिकॉर्ड डालने के लिए लाने के बीच एक मूल्य डाला जाता है, तो आप या तो डुप्लिकेट डेटा या उठाए गए त्रुटि के साथ समाप्त हो जाएंगे (यदि कोई अनुक्रमणिका डेटाबेस पर सेट है या नहीं। unique_constraint/3 इस दौड़ की स्थिति नहीं है।

ध्यान देने योग्य एक बात यह है कि जब तक किसी सम्मिलन का प्रयास नहीं किया जाता है तब तक विशिष्टता ज्ञात नहीं होती है, इसलिए अनन्य बाधा आपके सत्यापन के बाद होती है। सत्यापन और बाधा दोनों त्रुटियों को प्रदर्शित करना संभव नहीं है एक बार।

डेटाबेस आप भी अद्वितीय की कमी का समर्थन करना चाहिए उपयोग कर रहे हैं। वे SQLite के साथ काम नहीं करेगा। आप GitHub issue के बारे में अधिक पढ़ सकते हैं।

अपना माइग्रेशन में:

create unique_index(:users, [:email]) 

फिर अपने मॉडल में:

cast(user, params, ~w(email), ~w()) 
|> unique_constraint(:email) 

यह ध्यान देने योग्य है कि Ecto एक validate_unique/3 समारोह जो डेटाबेस पर एक प्रश्न करने से काम प्रदान करने के लिए प्रयोग किया जाता है लायक है, हालांकि इसे unique_constraint/3 के पक्ष में हटा दिया गया था version 0.16.0

+0

हाय, यह एक और त्रुटि की ओर जाता है http://stackoverflow.com/q uestions/32468172/ecto-create-unique-index-fail – ardhitama

+0

~ w (ईमेल) और ~ w() क्या करता है? – sheldonkreger

+0

~ डब्ल्यू (...) वाक्यविन्यास एक सूची बनाता है। http://elixir-lang.org/docs/stable/elixir/Kernel.html#sigil_w/2 – Gazler

संबंधित मुद्दे