2012-07-03 18 views
7

के साथ रेल का दायरा जब आप सक्रिय रिकॉर्ड के साथ रेल में एक बूलियन का उपयोग कर रहे हैं, और आप visible? पूछते हैं (कहें) यह कॉलम की जांच करता है कि यह true है या नहीं। यदि यह false या nil है, visible?false वापस करेगा।बूलियन

? विधि गलत होने पर पूछने के लिए आप एक बूलियन कैसे गुंजाइश करते हैं? मेरे पास यह है:

scope :visible, where(hide: [nil, false]) 

लेकिन मुझे लगता है कि क्लीनर तरीका है या नहीं। nil और false दोनों स्पष्ट रूप से कहने के बिना इस दायरे को लिखने का कोई तरीका है? अगर हम विपरीत थे, तो हम केवल

scope :invisible, where(hide: true) 

लिख सकते हैं जो क्लीनर लगता है। के लिए स्कोप के लिए सबसे अच्छा कोड क्या है?

+0

डीबी में 'छुपाएं' को डिफ़ॉल्ट मान क्यों न दें, तो दायरा साफ-सुथरा दिखता है: 'दायरा: दृश्यमान, जहां (छुपाएं: झूठा) ' – Wukerplank

+0

यही वह है जो मैं जा रहा हूं - मैं' डी हालांकि डीबी को सख्ती से झूठा/सत्य प्राप्त करने से बचें। – Peter

उत्तर

4

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

यदि आपको 2 से अधिक राज्यों की आवश्यकता है, तो एक राज्य मशीन या कुछ इसी तरह का उपयोग करें - तो यह अब बूलियन कॉलम/राज्य नहीं है।

scope :visible, -> { where(hide: false) } 
scope :invisible, -> { where(hide: true) } 

एसक्यूएल NULL में तो कडाई के रिकॉर्ड गुम या अज्ञात मूल्य का प्रतिनिधित्व करता hide = NULL न दिखाई है और न ही अदृश्य हैं साथ:

12

मैं के साथ जाना चाहते हैं।

3

स्टीफन के जवाब के रूप में लगभग एक ही है, एक सा सरलीकृत:

scope :visible, where(hide: false) 
scope :invisible, where(:hide) 

यह PostgreSQL के लिए काम करता है, लेकिन मुझे यकीन है कि यह अन्य डेटाबेस के लिए काम करेंगे नहीं हूँ।

+2

रेल में 4: दायरा: दृश्यमान, -> {जहां (छुपाएं: झूठा)} – benoitr

0

रेल 4 के रूप में, आप तो जैसे यह पूरा कर सकते हैं:

# This will give you any hidden records 
scope :invisible, -> { where(hide: true) } 

# And this will give you any records that aren't hidden – whether nil *or* false 
scope :visible, -> { where.not(hide: true) } 

हालांकि टैनेल का जवाब वास्तव में हाथ में सवाल है, जो उत्तर नहीं मिलता है "क्या दिखाई के लिए सबसे अच्छा कोड है गुंजाइश? ", मैं निश्चित रूप से गूंजता हूं कि उन्होंने कहा कि एक बूलियन कॉलम हमेशा true या false होना चाहिए।

वास्तव में, कोई डेटाबेस भी एक स्तंभ की अनुमति चाहिए boolean के रूप में घोषित true या false क्योंकि के अलावा और कुछ हो सकता है, अन्यथा, यह सच बूलियन नहीं है। लेकिन यह कीड़े का एक अलग कर सकते हैं। :- डी

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