"संवेदनशीलता को वैधता देता है" केस संवेदनशीलता


95

यहाँ मॉडल है (मैं SQLLite3 का उपयोग कर रहा हूँ):

class School < ActiveRecord::Base

  validates_uniqueness_of :name

end

उदाहरण के लिए, के बाद मैं "येल" जोड़ने के लिए, मैं "येल" नहीं कर पाएंगे लेकिन कर सकते हैं जोड़ने "येल।" मैं सत्यापन मामले को असंवेदनशील कैसे बना सकता हूं?

संपादित करें: यह पाया - सक्रिय रिकॉर्ड मान्यताओं

जवाबों:


232

validates_uniqueness_of :name, :case_sensitive => falseकाम कर देता है, लेकिन आप को ध्यान में रखना चाहिए कि validates_uniqueness_ofहै नहीं विशिष्टता की गारंटी यदि आप एकाधिक सर्वर / सर्वर प्रक्रियाओं (जैसे चल Phusion यात्री, कई mongrels, आदि) या एक बहु-थ्रेडेड सर्वर है। ऐसा इसलिए है क्योंकि आपको घटनाओं का यह क्रम मिल सकता है (आदेश महत्वपूर्ण है):

  1. प्रक्रिया ए को 'फू' नाम से एक नया उपयोगकर्ता बनाने का अनुरोध मिलता है
  2. प्रोसेस बी यही काम करता है
  3. प्रक्रिया A, DB से पूछकर 'foo' की विशिष्टता को मान्य करता है यदि वह नाम अभी तक मौजूद है और DB कहता है कि नाम अभी तक मौजूद नहीं है।
  4. प्रोसेस बी एक ही काम करता है और एक ही प्रतिक्रिया प्राप्त करता है
  5. प्रक्रिया ए insertनए रिकॉर्ड के लिए विवरण प्रस्तुत करती है और सफल होती है
  6. यदि आपके पास उस क्षेत्र के लिए विशिष्टता की आवश्यकता वाला एक डेटाबेस बाधा है, तो प्रोसेस बी insertनए रिकॉर्ड के लिए विवरण प्रस्तुत करेगा और SQL एडाप्टर से वापस आने वाले एक बदसूरत सर्वर अपवाद के साथ विफल हो जाएगा। यदि आपके पास एक डेटाबेस बाधा नहीं है, तो इंसर्ट सफल होगा और आपके पास अब नाम के रूप में 'फू' वाली दो पंक्तियाँ होंगी।

validates_uniqueness_ofरेल डाक्यूमेंट में "कंसीडर और इंटीग्रिटी" भी देखें ।

से रूबी ऑन रेल्स 3 संस्करण पर :

... इसके नाम के बावजूद, validates_uniqueness_of वास्तव में गारंटी नहीं देता है कि स्तंभ मान अद्वितीय होंगे। सभी यह सत्यापित कर सकते हैं कि किसी भी कॉलम का वैसा ही मूल्य नहीं है जैसा कि रिकॉर्ड में उस समय मान्य किया जाता है जब सत्यापन किया जाता है। एक ही समय में दो रिकॉर्ड बनाना संभव है, प्रत्येक एक कॉलम के लिए समान मूल्य के साथ जो अद्वितीय होना चाहिए, और दोनों रिकॉर्ड सत्यापन के लिए। विशिष्टता को लागू करने का सबसे विश्वसनीय तरीका एक डेटाबेस-स्तर की बाधा है। "

इस प्रोग्रामर के अनुभव को भी देखें validates_uniqueness_of

नया खाता बनाते समय वेब पेज से आकस्मिक डबल-सबमिशन एक तरह से होता है। यह हल करने के लिए एक कठिन है क्योंकि उपयोगकर्ता को जो वापस मिलेगा वह दूसरी (बदसूरत) त्रुटि है और इससे उन्हें लगता है कि उनका पंजीकरण विफल हो जाएगा, जब वास्तव में यह सफल हुआ। इसे रोकने के लिए मैंने जो सबसे अच्छा तरीका खोजा है, वह है दोहरे उपयोग को रोकने की कोशिश करने के लिए जावास्क्रिप्ट का उपयोग करना।


4
एक नोट के रूप में - यहाँ एक पैच है, जिसे मैंने डीबी-स्तर की बाधाओं को बताकर
जॉर्डन

इसके अलावा, वहाँ बारहमासी "उपयोगकर्ता डबल ने सबमिट बटन" समस्या पर क्लिक किया है, लेकिन यह एक फिक्स का उपयोग करने से अधिक है: disable_with
Ghoti

78

रेल 3 में आप अपने मॉडल में ऐसा कर सकते हैं:

validates :name, :uniqueness => true

या case_s संवेदनशीलता के बिना

validates :name, :uniqueness => {:case_sensitive => false}

यह वही है जो मैं चाहता हूं।
जिगर भट्ट

1
मैं 10 साल से रेल कर रहा हूं। मुझे विश्वास नहीं हो रहा है कि मैं इस विकल्प के बारे में सीख रहा हूँ। रेल में सीखने के लिए हमेशा कुछ नया होता है ... किसी के कौशल स्तर की परवाह किए बिना।
डेनियल्रिकोड्स नोव

25

एक विकल्प है जहां आप केस असंवेदनशीलता को निर्दिष्ट कर सकते हैं

  validates_uniqueness_of :name, :case_sensitive => false

1

एक समान प्रश्न है लेकिन उत्तर अधिक दिलचस्प है: https://stackoverflow.com/a/6422771

मूल रूप से, :case_sensitive => falseएक बहुत ही अक्षम डेटाबेस क्वेरी का उपयोग करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.