2010-04-23 15 views
13

के साथ गतिशील विशेषताओं मैं रेलों (रेल 3 बीटा 3) के साथ मोंगोइड रूबी मणि के माध्यम से मोंगो डीबी सीख रहा हूं, और मैं क्षेत्रों के आधार पर मॉडल पर गतिशील विशेषताओं को बनाने के लिए एक तरीके से आने की कोशिश कर रहा हूं एक और मॉडल, जिसे मैंने सोचा था कि स्कीमा-कम डेटाबेस एक अच्छा विकल्प होगा।रेल और मोंगोइड

उदाहरण के लिए, मैं मॉडल होगा:

class Account 
    include Mongoid::Document 

    field :name, :type => String 
    field :token, :type => String 
    field :info_needed, :type => Array 

    embeds_many :members 
end 

class Member 
    include Mongoid::Document 

    embedded_in :account, :inverse_of => :members 

end 

मैं खाता मॉडल की "info_needed" विशेषता लेने के लिए देख रहा हूँ और सदस्य मॉडल अंदर क्या है के आधार पर डायनामिक विशेषताएं बनाया। अगर club.info_needed था ["first_name", "last_name"], तो मैं एक ऐसा फॉर्म बनाने की कोशिश कर रहा हूं जो सदस्य मॉडल में first_name और last_name विशेषताओं को सहेज लेगा।

हालांकि, अभ्यास पर, मैं ऐसा करने की कोशिश करते समय सदस्य मॉडल पर "अपरिभाषित विधि first_name =" त्रुटियां प्राप्त करता रहता हूं। मुझे पता है कि मोंगोडीबी प्रति रिकॉर्ड गतिशील विशेषताओं को संभाल सकता है, लेकिन मैं बिना किसी अपरिभाषित विधि त्रुटि के ऐसा करने के लिए Mongoid कैसे प्राप्त कर सकता हूं?

+1

मैं पूछूंगा कि आप उत्तर के रूप में नीचे मेरा उत्तर चुनते हैं क्योंकि यह वर्तमान में चयनित उत्तर से अधिक सटीक है। –

उत्तर

1

Mongoid वास्तव में इसका समर्थन नहीं करता है।

मैंगॉइड समूह में यह asked है।

यह संभव है जब आप इस तरह नया दस्तावेज़ बनाएँ,:

7

mongoid.yml में allow_dynamic_fields: true सेट करना सुनिश्चित करें। उदाहरण:

defaults: &defaults 
    allow_dynamic_fields: true 
    parameterize_keys: true 
    persist_in_safe_mode: true 
    raise_not_found_error: true 
    reconnect_time: 3 
    use_object_ids: false 

development: 
    <<: *defaults 

... 
+0

हाँ, मैंने यह किया था, लेकिन अभी भी परेशानी हो रही थी। यदि आपने यह किया है, और यह आपके लिए काम कर रहा है, तो शायद मैंने इस प्रश्न को पोस्ट करने के बाद से mongoid अपडेट किया गया था। – joeellis

+1

'allow_dynamic_attributes: true' को सेट करने के लिए डाउनसाइड यह है कि यह प्रति डेटाबेस है, और यह कि आप अपने कोड में बग के कारण अनचाहे फ़ील्ड के साथ अपनी स्कीमा को प्रदूषित कर सकते हैं।शायद इसे 'झूठी' पर सेट करने और जानबूझकर उपयोग करने के लिए सुरक्षित [], [] = – Tilo

26

Mongoid अब गतिशील फील्ड्स का समर्थन करता है। उनके प्रलेखन यहां पाया जा सकता: http://mongoid.org/en/mongoid/docs/documents.html#dynamic_fields

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

[], [] = read_attribute(), write_attribute() के लिए शॉर्टकट हैं, और यदि आप dynamic_attributes = true को अपने ./config/mongoid.yml file में सेट नहीं करते हैं, अन्यथा आपको कोई विधि त्रुटि नहीं मिलेगी।

allow_dynamic_fields: true सेट करना जोखिम भरा हो सकता है, क्योंकि आप अपने कोड में बग के कारण अनजान फ़ील्ड के साथ अपने डेटा/स्कीमा को प्रदूषित कर सकते हैं। यह false को यह सेट और स्पष्ट रूप से उपयोग करें [] करने के लिए, [] शायद सुरक्षित है =

# Raise a NoMethodError if value isn't set. 
person.gender 
person.gender = "Male" 

# Retrieve a dynamic field safely. 
person[:gender] 
person.read_attribute(:gender) 

# Write a dynamic field safely. 
person[:gender] = "Male" 
person.write_attribute(:gender, "Male") 
+1

इसे 4.0 में हटा दिया गया है – monksy

1

गतिशील के बारे में दिलचस्प लेख Mongoid साथ गुण और 3.1 रेल: http://paul-wong-jr.blogspot.com/2012/03/dynamic-attributes-and-mongodbmongoid.html

केवल गतिशील कुंजी/मान जोड़े या उपयोग करने के लिए गतिशील विशेषता नाम, यह भी देखें: List dynamic attributes in a Mongoid Model

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