2013-10-23 3 views
7

बदलता है मेरे पास एक शर्त का उपयोग करके परिभाषित एक अद्वितीय बाधा है। लेकिन निम्नलिखित परीक्षा उत्तीर्ण नहीं करता है:Mongoid: प्रमाणीकरण "validates_uniqueness_of" केवल तभी ट्रिगर होता है जब विशिष्ट फ़ील्ड

class Dummy 
    include Mongoid::Document 

    field :name, :type => String 
    field :status, :type => Boolean 

    validates_uniqueness_of :name, if: :status 
end 


describe "UniquenessValidator" do 
    let!(:d1) { Dummy.create!(name: 'NAME_1', status: true) } 
    let!(:d2) { Dummy.create!(name: 'NAME_1', status: false) } 

    it "should raise an error" do 
    expect { 
     d2.status = true 
     d2.save! 
    }.to raise_error 
    end 
end 

के बाद से name_changed? गलत है, कोई सत्यापन हो रहा है और इसलिए विशिष्टता हालत की जाँच नहीं है।

क्या यह एक बग है? या मैं कुछ भूल गया हूँ? मुझे लगता है कि प्रत्येक बार तत्व संशोधित होने पर सत्यापन चलाने से बचने के लिए यह एक अनुकूलन है।

उस स्थिति में स्थिति बदलने पर सत्यापन को ट्रिगर करने का अच्छा तरीका क्या है?

धन्यवाद!

+3

[mongoid डॉक्स] (http://mongoid.org /en/mongoid/docs/validation.html) बताता है कि "पहले से ही जारी डेटा पर # valid का उपयोग करते समय मोंगोइड सक्रिय रिकॉर्ड से थोड़ा अलग व्यवहार करता है। सक्रिय रिकॉर्ड का # अमान्य? सभी मान्यताओं को चलाएगा जबकि मोंगोइड का # अमान्य? केवल वैधताएं चलाएगा दस्तावेज जो स्मृति में अनुकूलन के रूप में हैं। " शायद यह मदद करता है। –

+0

@ p11y: वास्तव में (https://github.com/mongoid/mongoid/blob/3.1.0-stable/lib/mongoid/validations/uniqueness.rb#L289)। हमम ... – Aymeric

+1

गंदा वर्कअराउंड: मॉडल def attribute_changed? (attr) अगर attr == 'name' और self.status_changed में ओवरराइड करें? सच अन्य सुपर अंत अंत – Aymeric

उत्तर

5

आप मामले एक किनारे मामला है, मैं इसके लिए अपने खुद के सत्यापनकर्ता वर्ग बनाने के लिए सलाह होगा, कुछ इस तरह काम करना चाहिए:

class NameUniquenessValidator < Mongoid::Validatable::UniquenessValidator 
private 
    def validation_required?(document, attribute) 
    return true "name" == attribute.to_s 
    super 
    end 
end 

class Dummy 
    include Mongoid::Document 

    field :name, :type => String 
    field :status, :type => Boolean 

    validates_with(NameUniquenessValidator, :name, if: :status) 
end 
+0

एफवाईआई, मैंने एक जिथब मुद्दा बनाया है: https://github.com/mongoid/mongoid/issues/3343 – Aymeric

+0

कूल .. मैं भी इसमें एक नज़र डालूंगा। –

1

आप स्थिति फ़ील्ड अपडेट कर रहे हैं, इसलिए आपको इस फ़ील्ड को सत्यापित करने की आवश्यकता है। जब आप एक ही क्षेत्र अद्यतन

class Dummy 
    include Mongoid::Document 

    field :name, :type => String 
    field :status, :type => Boolean 

    validates_uniqueness_of :name, if: :status 
    validates_uniqueness_of :status, scope: :name, if: :status 
end 

यदि आप सभी क्षेत्रों को मान्य करने के mongoid मजबूर कर सकते हैं मैं नहीं जानता: आप कुछ इस तरह कर सकते हैं।

+0

यह सही दिशा में एक कदम की तरह लगता है, लेकिन यह सत्यापित करना कि स्थिति अद्वितीय है दुर्भाग्यवश सामान्य मामले में व्यवहार्य समाधान नहीं है, यानी जब निर्भर विशेषता अद्वितीय नहीं है। –

+0

इसके अलावा, आप 'स्थिति' से पहले अंतिम पंक्ति में एक कोलन खो रहे हैं। संपादित। –

+0

हाँ, यह इस मामले के लिए एक समाधान है। सामान्य स्थिति के लिए आपको स्थिति गुणों के आधार पर स्थिति फ़ील्ड के लिए कस्टम सत्यापन बनाना होगा। सुधारों के लिए धन्यवाद। – drinor

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