validates_uniqueness_of :name, :case_sensitive => false
काम कर देता है, लेकिन आप को ध्यान में रखना चाहिए कि validates_uniqueness_of
है नहीं विशिष्टता की गारंटी यदि आप एकाधिक सर्वर / सर्वर प्रक्रियाओं (जैसे चल Phusion यात्री, कई mongrels, आदि) या एक बहु-थ्रेडेड सर्वर है। ऐसा इसलिए है क्योंकि आपको घटनाओं का यह क्रम मिल सकता है (आदेश महत्वपूर्ण है):
- प्रक्रिया ए को 'फू' नाम से एक नया उपयोगकर्ता बनाने का अनुरोध मिलता है
- प्रोसेस बी यही काम करता है
- प्रक्रिया A, DB से पूछकर 'foo' की विशिष्टता को मान्य करता है यदि वह नाम अभी तक मौजूद है और DB कहता है कि नाम अभी तक मौजूद नहीं है।
- प्रोसेस बी एक ही काम करता है और एक ही प्रतिक्रिया प्राप्त करता है
- प्रक्रिया ए
insert
नए रिकॉर्ड के लिए विवरण प्रस्तुत करती है और सफल होती है
- यदि आपके पास उस क्षेत्र के लिए विशिष्टता की आवश्यकता वाला एक डेटाबेस बाधा है, तो प्रोसेस बी
insert
नए रिकॉर्ड के लिए विवरण प्रस्तुत करेगा और SQL एडाप्टर से वापस आने वाले एक बदसूरत सर्वर अपवाद के साथ विफल हो जाएगा। यदि आपके पास एक डेटाबेस बाधा नहीं है, तो इंसर्ट सफल होगा और आपके पास अब नाम के रूप में 'फू' वाली दो पंक्तियाँ होंगी।
validates_uniqueness_of
रेल डाक्यूमेंट में "कंसीडर और इंटीग्रिटी" भी देखें ।
से रूबी ऑन रेल्स 3 संस्करण पर :
... इसके नाम के बावजूद, validates_uniqueness_of वास्तव में गारंटी नहीं देता है कि स्तंभ मान अद्वितीय होंगे। सभी यह सत्यापित कर सकते हैं कि किसी भी कॉलम का वैसा ही मूल्य नहीं है जैसा कि रिकॉर्ड में उस समय मान्य किया जाता है जब सत्यापन किया जाता है। एक ही समय में दो रिकॉर्ड बनाना संभव है, प्रत्येक एक कॉलम के लिए समान मूल्य के साथ जो अद्वितीय होना चाहिए, और दोनों रिकॉर्ड सत्यापन के लिए। विशिष्टता को लागू करने का सबसे विश्वसनीय तरीका एक डेटाबेस-स्तर की बाधा है। "
इस प्रोग्रामर के अनुभव को भी देखें validates_uniqueness_of
।
नया खाता बनाते समय वेब पेज से आकस्मिक डबल-सबमिशन एक तरह से होता है। यह हल करने के लिए एक कठिन है क्योंकि उपयोगकर्ता को जो वापस मिलेगा वह दूसरी (बदसूरत) त्रुटि है और इससे उन्हें लगता है कि उनका पंजीकरण विफल हो जाएगा, जब वास्तव में यह सफल हुआ। इसे रोकने के लिए मैंने जो सबसे अच्छा तरीका खोजा है, वह है दोहरे उपयोग को रोकने की कोशिश करने के लिए जावास्क्रिप्ट का उपयोग करना।