2010-09-06 15 views
9

मैं बहुत उलझन में हूं कि रुपेक और रेल में बुलियन मूल्यों को कैसे सत्यापित किया जाए। मैं false और nil को छोड़कर सब कुछ समझता हूं रूबी में true के रूप में लिया जाता है। लेकिन जब मैं रेल के साथ MySQL का उपयोग करता हूं, तो यह 1true और 0false (यदि मेरी समझ सही है) के लिए उपयोग करता है।रुपेक और रेल में बूलियन मान मान्य करना

मेरे पास निम्न मॉडल spec है। मैं superuser विशेषता के लिए बूलियन मान का परीक्षण करना चाहता हूं।

  • मैं यहां चश्मा कैसे लिख सकता हूं?
  • मैं यहां कार्यान्वयन कोड कैसे लिख सकता हूं?
  • क्या मेरे चश्मा और कार्यान्वयन कोड एक विशिष्ट डेटाबेस (जैसे MySQL और PostgreSQL) के लिए विशिष्ट हैं?

    require 'spec_helper' 
    describe User do 
        before(:each) do 
        @valid_attributes = { 
         :username => "mike", 
         :password => "super_encryped_password", 
         :email => "[email protected]", 
         :superuser => true 
        } 
        end 
    
        it "should create a new instance given valid attributes" do 
        User.create!(@valid_attributes) 
        end 
    
        it "should have true or false for superuser" do 
        @valid_attributes[:superuser] = "hello" 
        User.new(@valid_attributes).should have(1).error_on(:superuser) 
        end 
    end 
    

उत्तर

0

एक महत्वपूर्ण बात यह है कि ActiveRecord दृश्यों के पीछे टाइपकास्टिंग करता है, इसलिए आपको चिंता करने की ज़रूरत नहीं है कि आपका डेटाबेस बूलियन मूल्यों को कैसे संग्रहीत करता है। आपको यह भी सत्यापित करने की आवश्यकता नहीं है कि एक क्षेत्र बूलियन है, जब तक आप उस क्षेत्र को अपने माइग्रेशन की तैयारी करते समय बूलियन के रूप में सेट करते हैं। आप यह सुनिश्चित करना चाहते हैं कि फ़ील्ड nil नहीं है, हालांकि validates_presence_of :superuser आपके मॉडल वर्ग में घोषणा के साथ।

+0

यही वह जवाब है जो मैं चाहता था। जब तक मैं फील्ड बूलियन सेट करता हूं तब तक मुझे इसके बारे में चिंता करने की आवश्यकता नहीं है। जानकर ख़ुशी हुई की। –

+0

वह समय कॉलम में समान है? –

+0

@ टीके: बिलकुल ठीक है। – edgerunner

0

मुझे लगता है कि आप चाहते हैं विफल "सच है या सुपर उपयोगकर्ता के लिए झूठी होना चाहिए"। लेकिन अगर आप इसे विफल करना चाहते हैं, तो आप उपयोगकर्ता में एक मान्यता जोड़ना चाहिए:

validate :superuser_boolean 

def superuser_boolean 
    errors.add(:superuser, "Should be a boolean") if !superuser.is_a?(TrueClass) && !superuser.is_a?(FalseClass) 
end 
+0

आपका उत्तर बहुत अच्छा दिखता है। मैं 'is_a के साथ नहीं आया था? TrueClass'। मैं इस पर गौर करूंगा। –

+0

अगर आप फिसल गए हैं और जब तक & quot; –

0

jordini के जवाब बंद आधारित है:

def superuser_boolean 
    errors.add(:superuser, "Should be a boolean") if [true, false].include?(superuser) 
end 

कोई बदसूरत is_a चेक, बस एक साधारण include?

+0

'is_a?' बदसूरत क्या है? –

+0

@ टीके: हाँ, और इसे दो बार चलाने के लिए मेरे ज्ञान को शामिल करने की तुलना में धीमा है? एक बार। –

+0

धन्यवाद। मैं आपके उत्तर की सराहना करता हूं। –

0

डीईएफ़ बूलियन? (वैल) !! वैल == वैल अंत

अपने spec_helper में यह शामिल करें या be_boolean साथ rspec का विस्तार।

7

यह कुछ महत्वपूर्ण बिंदुओं के साथ एक महान चर्चा है: रेल स्वचालित रूप से बूलियन फ़ील्ड को मान्य करता है, एक झूठा मूल्य "उपस्थिति" विफलताओं को विफल करने का कारण बनता है, और यदि आप सुनिश्चित करना चाहते हैं तो वास्तविक झूठी सेटिंग्स के लिए स्पष्ट रूप से एक कस्टम सत्यापन की आवश्यकता है एक बूलियन क्षेत्र शून्य नहीं है लेकिन वास्तविक वास्तविक या गलत मूल्य है। ,

http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion

इस सहायक के साथ मान्य एक बूलियन क्षेत्र एक सच्चे है या एक झूठी मूल्य इस तरह दिखता है कि: शामिल किए जाने के सहायक:

रेल 3.x के लिए एक त्वरित अपडेट

validates :superuser, :inclusion => {:in => [true, false], :message => 'requires a true or false value' } 

संदेश वैकल्पिक है और दस्तावेज नोट्स के रूप में, "सूची में शामिल नहीं है" के रूप में डिफ़ॉल्ट होगा।

आम सहमति ऑनलाइन सच या गलत के लिए स्पष्ट रूप से मान्य होने की परेशानी नहीं है, लेकिन रेलों को इसकी देखभाल करने दें।मैं एक परिस्थिति में भाग गया, हालांकि, स्पष्ट मान्यताओं ने डेटाबेस में एक समस्या उठाई (MySQL tinyint फ़ील्ड 1 की बजाय लंबाई में 2 या 4 पर सेट की गई थी) जिसके कारण एक अजीब व्यवहार हुआ। खेतों को सही या गलत पर सेट किया जा सकता है, लेकिन मूल्य को बुलियन के रूप में वापस नहीं पढ़ा जा सका। दूसरे शब्दों में, रेल सत्यापन ने इसे पारित किया लेकिन स्पष्ट समावेशन सत्यापन उन सभी मामलों को ध्वजांकित किया जहां डेटाबेस गलत कॉन्फ़िगर किया गया था। तो यह उन प्रविष्टियों को सत्यापित करने की परेशानी पर जाने का एक अच्छा कारण हो सकता है। उम्मीद है कि यह मदद करता है। चार्ल्स

+0

यह मेरे लिए सबसे साफ समाधान जैसा दिखता है, पूरी तरह से बुलियन सत्यापन को छोड़ने से कम। यह रेलों के अंतर्निर्मित सत्यापन का उपयोग करके काम करता है, और किसी भी गलत कॉन्फ़िगरेशन को पकड़ते समय डीबी-अज्ञेयवादी होना चाहिए। – sockmonk

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