2011-04-24 10 views
18

के लिए रेल सत्यापन को छोड़ें मेरे पास एक उपयोगकर्ता वर्ग है, और एक संपर्क जहां संपर्क उपयोगकर्ता का उप-वर्ग है। दोनों कक्षाओं को उपयोगकर्ता तालिका में संग्रहीत किया जाता है।रेल - सबक्लास

मेरे संपर्कों में ईमेल पता हो सकता है या नहीं, जबकि मेरे उपयोगकर्ताओं के लिए एक ईमेल पता आवश्यक है (मेरे पास validates_presence_of :email है जो मेरी उपयोगकर्ता मॉडल परिभाषा में है)।

मेरा तर्क यह है कि संपर्क उपयोगकर्ताओं द्वारा दर्ज किए जाते हैं और बाद में जब वे अपनी प्रोफ़ाइल का दावा करते हैं तो उपयोगकर्ता बन सकते हैं।

  • सबसे पहले, क्या यह मेरे उपयोगकर्ताओं और संपर्कों को परिभाषित करने के लिए ठीक है?
  • दूसरा, मैं अपने संपर्क मॉडल में validate_presence_of email सत्यापन कैसे छोड़ूं?

धन्यवाद (मैं रेल 2.3.8 पर हूँ)!

अद्यतन:

  • ऐसा लगता एकल टेबल विरासत वास्तव में क्या मैं अपने संपर्क के लिए ईमेल की उपस्थिति के लिए सत्यापन छोड़ करने के लिए

  • सही तरीके से की जरूरत तालिका है ऐसा करने के लिए डिज़ाइन किया गया है जैसा कि अनुसरण करें:

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

+1

नहीं उपयोगकर्ता एक उपवर्ग होना चाहिए

इस तरह आप सही ढंग से मॉडल को मान्य होता है संपर्क का? ऐसा लगता है कि एक उपयोगकर्ता * एक * संपर्क है जो पंजीकृत है। लेकिन एक संपर्क जरूरी नहीं है उपयोगकर्ता। इससे आपकी सत्यापन समस्या भी हल हो जाएगी, क्योंकि उपयोगकर्ता मॉडल में प्रमाणीकरण होगा, जब तक कि किसी की आवश्यकता को अस्वीकार न किया जाए। – Raphael

उत्तर

22

ऐसा लगता है कि आपको उपयोगकर्ता को एक सारणी में एकजुट करने की कोशिश करने के बजाय दो तालिकाओं में अवलोकन करना चाहिए। हालांकि संपर्क उपयोगकर्ता बन सकते हैं, इसका मतलब यह नहीं है कि वे (मुझे लगता है?)।

यह आपके validate_presence_of :email प्रश्न को भी हल करेगा, क्योंकि संपर्क तालिका/मॉडल में फ़ील्ड भी नहीं होगा। मुझे विश्वास है कि बाद में संभावित प्रदर्शन चिंताओं को भी कम किया जाएगा, मुझे विश्वास है। एक पंजीकृत उपयोगकर्ता को खोजने के लिए आप संपर्क करने के लिए संपर्कों का एक टन नहीं चाहते हैं।

आप हालांकि एक तालिका में यह कर रही पर मृत सेट कर रहे हैं, मेरा मानना ​​है कि आप की तरह कुछ कर सकते हैं निम्नलिखित:

validates_presence_of :email, :unless => Proc.new {|user| user.type == "Contact"}

यह मानते हुए है आप एक user_type स्तंभ है, लेकिन आप UserContact है या नहीं, इस पर निर्भर करता है कि आप कैसे निर्धारित कर रहे हैं।

अद्यतन: मॉडल से निकालें validates_presence_of और इस ब्लॉक के अंदर यह जगह:

with_options :unless => :user_type == "contact" do |user| 
    user.validates_presence_of :email 
end 
+0

मेरे पास वर्तमान में मेरे उपयोगकर्ता तालिका में "user_type" फ़ील्ड है जो कहता है कि पंक्ति उपयोगकर्ता या संपर्क के लिए है या नहीं। एक ही टेबल में दोनों होने के कारण, जब वे अपनी प्रोफ़ाइल का दावा करते हैं तो उपयोगकर्ता के संपर्क में परिवर्तन करना आसान हो जाता है। और सभी फ़ील्ड समान हैं, केवल ईमेल पर सत्यापन अलग है। यही कारण है कि मैं एक ही टेबल का उपयोग करना चाहता हूं। कोई भी संकेत मैं ईमेल फ़ील्ड के सत्यापन के लिए कैसे बाईपास कर सकता हूं (वैकल्पिक रूप से, मैं Contact.save (झूठा) कर सकता हूं, लेकिन यह केवल ईमेल के लिए सभी मान्यताओं को छोड़ देता है। – alex

+0

मैं समझता हूं कि यह एक बुरा तरीका नहीं है चीजें करें। मेरी समझ के लिए, उपयोगकर्ताओं के पास संभावित रूप से सैकड़ों संपर्क हो सकते हैं जो आवश्यक रूप से पंजीकृत उपयोगकर्ता नहीं होंगे। यदि आपकी साइट 100,000 उपयोगकर्ताओं तक बढ़ी है, तो इसे एक तालिका में समेकित करने के प्रदर्शन के प्रभावों के बारे में सोचें। हालांकि वर्तमान में यह कोई समस्या नहीं है, यदि यह कभी भी होता है तो इसे स्विच करने में परेशानी होगी और फिर डिज़ाइन में बदलाव कर रहे हैं। आप अनिवार्य रूप से संभावित रूप से बड़ी मेज नहीं होने के लिए अधिक डेटाबेस कॉल का व्यापार कर रहे हैं। –

+0

इसके अलावा, मेरे अपडेट किए गए उत्तर को देखें। 'validates_presence_of : ईमेल जब तक ... 'बिट काम करना चाहिए, अगर स्मृति सही ढंग से मेरी सेवा करता है। –

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