Rails - Custom Validation For Having A Single Value Once -
इसलिए मेरे पास ये दो मॉडल हैं:
वर्ग टैग & lt; ActiveRecord :: बेस has_many: event_tags attr_accessible: tag_id,: टैग_प्रकार,: मूल्य अंत वर्ग EventTag & lt; ActiveRecord :: बेस is_to: tag attr_accessible: tag_id,: event_id,: क्षेत्र अंत और टैग के लिए यह तालिका:
** टैग_id ** * * टैग_type ** ** मूल्य ** 1 "मजेदार" "" बोरिंग ... "2" मज़े लेवल "" लिटिल "3" मज़े लेवल "" हेलज़ या "4" जेनेरिक "" कम जोकर की जरूरत है "5" सामान्य "" लेजर टैग "... मैं क्या करना चाहता हूं एक कस्टम सत्यापन लिखा है, जहां यह देखने की जांच करता है:
- प्रत्येक इवेंट_आईड में केवल <
t1 = EventTag.new (: टैग_id = & gt; 1 ,: event_id = & gt; 777,: क्षेत्र = & gt; 'यूएस') t1.save # सफलता t2 = EventTag.new (: टैग_id = & gt; 2,: event_id = & gt; 777,: क्षेत्र = & gt; 'यूएस') t2.save # failure # क्योंकि (event_id: 777) में पहले से ही "funLevel" का एक tag_type संबद्ध है t3 = EventTag.new (: tag_id = & gt; 4,: event_id = & Gt; 777,: क्षेत्र = & gt; 'यूएस') t3.save # सफलता, क्योंकि (टैग_id: 4) "मजेदार लेवल" प्रकार नहीं है def cannot_have_multiple_funLevel_tag list_of_tag_ids = EventTag.where ("event_id =?", Event_id) .pluck (: tag_id) यदि (टैग। जहां ("टैग_id में?", List_of_tag_ids) .pluck (: tag_type)। शामिल करें? "FunLevel") errors.add (: tag_id, "पहले से ही एक मजेदार लेवल टैग है!") अंत रेल के लिए नया होने के कारण, एक बेहतर / अधिक सुंदर / अधिक सस्ता तरीका है ?
जिस तरीके से आपके पास अपना डेटा संरचित है इसका मतलब है कि इनबिल्ट रेल मान्यताओं संभवत: एक आप के लिए मदद का ढेर यदि मजेदार लेवल विशेषता को EventTag वर्ग से सीधे पहुँचा जा सकता है, तो आप ऐसा ही कुछ इस्तेमाल कर सकते हैं: # Event_tag.rb मान्य: टैग प्रकार, विशिष्टता: {गुंजाइश:: event_id}, यदि: Proc.new {| टैग | Tag.tag_type == "funLevel"} (दुर्भाग्यवश, एक त्वरित परीक्षण से आप वर्चुअल विशेषता की विशिष्टता को मान्य करने में सक्षम नहीं लगते।) < P> उसके बिना, आप शायद एक कस्टम सत्यापन का उपयोग कर अटक गए हैं आपके पास कस्टम सत्यापन में स्पष्ट सुधार (ऐसा लगता है कि आप EventTag पर सत्यापन करना चाहते हैं) मान्यता को नहीं चलाना होगा, जब तक कि EventTag एक < Code> funLevel टैग: def cannot_have_multiple_funLevel_tag जब तक self.tag.tag_type == "funLevel" ... अंत < / html>
Comments
Post a Comment