2011-01-16 13 views
6

मैंगोडब के साथ काम करने के लिए मैं रेल और मोंगोइड का उपयोग कर रहा हूं।mongdb के साथ सरल बूलियन डेटा अपडेट?

आम तौर पर सक्रिय: रिकॉर्ड के साथ काम करते समय रेल में, आपके पास विधि तक पहुंच है। टॉगल! जो आपको बस अपने डीबी में एक बूलियन क्षेत्र के मूल्य को उलटा करने की अनुमति देता है।

दुर्भाग्य से इस विधि MongoDB के लिए उपलब्ध नहीं है:

user = User.first 
user.toggle!(:admin) 
NoMethodError: undefined method `toggle!' for #<User:0x00000100eee700> 

यह दुर्भाग्य की बात है ... और मूर्खता से पर्याप्त मैं कुछ जटिल कोड के बिना चारों ओर पाने के लिए नहीं दिख रहा है ...

कोई संक्षेप में एक ही परिणाम कैसे प्राप्त करें इस पर सुझाव?

धन्यवाद,

एलेक्स

पुनश्च: यह भी समस्याओं में से एक यह है कि जब मैं मैदान संशोधित करना चाहते हैं, यह फिर से सत्यापन के माध्यम से चला जाता है ... और इसके लिए पूछ रहा है: पासवर्ड, जो मैं डॉन 'टी DB में बचाने के लिए, तो:

User.first.admin = !User.first.admin 

भी काम नहीं करेगा :(

उत्तर

6

यहां मुद्दा यह विशेष रूप से mongoid है, MongoDB नहीं toggle! 0 का एक हिस्सा है।, लेकिन सौभाग्य से यह दोहराना मुश्किल नहीं है।

def toggle!(field) 
    send "#{field}=", !self.send("#{field}?") 
    save :validation => false 
end 

कि जोड़े अपने मॉडल में (या यह एक मॉड्यूल में जोड़ने के लिए, और अपने मॉडल में शामिल), और क्या आप एआर में करने के लिए इस्तेमाल कर रहे हैं अपने Mongoid मॉडल के लिए कार्यक्षमता बराबर प्राप्त होगा। यह फ़ील्ड के मान को पढ़ेगा, इसे उलटा करेगा, इसे लिखने के लिए (सेटर के माध्यम से, toggle! दस्तावेज प्रति), और उसके बाद सत्यापन को बाईपास करके दस्तावेज़ को सहेजें।

+0

यह वास्तव में अद्भुत है! वास्तव में मैं क्या देख रहा था ... :) मुझे सिंटैक्स भेजने के साथ नहीं पता था? मुझे यकीन नहीं है कि यह वास्तव में क्या करता है? – Alex

+0

'send' किसी ऑब्जेक्ट को" ("संदेश भेजता है") को एक ऑब्जेक्ट का आह्वान करता है। '@ foo.bar (: baz)' 'foo.send (" bar ",: baz) जैसा ही है '- चूंकि आप भेजने के साथ विधि नाम निर्दिष्ट करते हैं, तो आप चर और ऐसे पास कर सकते हैं। रूबी मेटाप्रोग्रामिंग में इसका अत्यधिक उपयोग किया जाता है। स्पष्टीकरण के लिए –

+0

धन्यवाद। हालांकि पूरी तरह से परीक्षण करने के बाद यह वास्तव में सभी सत्यापन को बाईपास नहीं करता है। मेरे पास validates_length_of है: पासवर्ड,: न्यूनतम => 6, अधिकतम => 40, और टॉगल का उपयोग करके मुझे पासवर्ड की लंबाई पर एक त्रुटि होगी ... :(लेकिन मान्यताओं पर नहीं, आदि। और यह छोड़ देता है attr_accesible, आदि। लंबाई लंबाई के अलावा यह लगभग सही है – Alex

0

ठीक सत्यापन एक प्रकार की वजह से काम नहीं किया, कोड होना चाहिए:

save :validate => false (not :validation) 
0
# Get object's boolean field and toggle it 
# @param [Object] mongoid object 
# @param [String, Symbol] flag 
# @example 
# foo = User.find('123') 
# toggle_flag!(object: foo, flag: :bar) 

def toggle_flag!(object:, flag:) 
    object.update(flag => !object[flag]) 
    object.save! 
end 
+0

अपना कोड समझाएं! –

+0

हो गया! मैंने समझ के लिए यार्ड का उपयोग किया। – arkhwise

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