2014-09-05 4 views
25

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

var belongsTo = DS.belongsTo, 
    hasMany = DS.hasMany; 

App.Comment = DS.Model.extend({ 
    onePost: belongsTo('post'), 
    twoPost: belongsTo('post'), 
    redPost: belongsTo('post'), 
    bluePost: belongsTo('post') 
}); 


App.Post = DS.Model.extend({ 
    comments: hasMany('comment', { 
    inverse: 'redPost' 
    }) 
}); 

इस उदाहरण में, क्यों redPost उलटा बजाय पदों के अन्य प्रकार के रूप में बाहर किया है: यह डॉक्स से नमूना है? redPost को परिभाषित करने के रूप में कैसे इसे बाकी से अलग करता है? मैं वास्तव में यह भी समझ नहीं पा रहा हूं कि एक टिप्पणी में वास्तव में कई पोस्ट क्यों हैं, बस मेरे भ्रम में जोड़ना।

उत्तर

51

सबसे पहले, this पोस्ट चीजों को थोड़ा सा समझा सकता है। यह आपका सटीक प्रश्न नहीं है, लेकिन उत्तर के कारण समान हैं।

लेकिन, इनवर्ड्स की स्पष्ट समझ प्राप्त करने के लिए, आपको directed graphs से परिचित होना चाहिए। तत्काल स्पष्ट नहीं होने पर, निर्देशित ग्राफ belongsTo और hasMany के पीछे विचार को ईंधन देते हैं।

लेकिन चलिए विशिष्टताओं पर वापस आते हैं। आइए उनका उदाहरण लें, इसे और अधिक यथार्थवादी बनाने के लिए केवल कुछ चीजों को खत्म करें।

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('comment', { inverse: 'post' }) 
}); 

App.Comment = DS.Model.extend({ 
    post: DS.belongsTo('post', { inverse: 'comments' }) 
}); 

यह एक और वास्तविक दुनिया का उदाहरण है। प्रत्येक पोस्ट में कई टिप्पणियां हो सकती हैं, जबकि एक टिप्पणी बिल्कुल एक पोस्ट से संबंधित होनी चाहिए। समझ में आता है। जैसा कि आप देख सकते हैं, वे उलटा एक दूसरे को संदर्भित करते हैं। लेकिन एक उलटा क्या है? एक व्यस्त रिश्ते बस वर्णन करता है कि दूसरी तरफ दो नोड्स के बीच किनारे को क्या कहा जाता है। उदाहरण के लिए, इस तस्वीर को देखने के:

enter image description here

आप उन दोनों के बीच एक भी बढ़त के साथ दो नोड्स देखेंगे। Post ऑब्जेक्ट के परिप्रेक्ष्य से, किनारे को comments कहा जाता है। यदि आप उस किनारे से जुड़े नोड को प्राप्त करना चाहते हैं, तो आप post.get('comments') पर कॉल कर सकते हैं। लेकिन Comment ऑब्जेक्ट के परिप्रेक्ष्य से, किनारे को post कहा जाता है। यदि आप Comment ऑब्जेक्ट का उपयोग करके उस किनारे से जुड़े नोड को प्राप्त करना चाहते हैं, तो आपको comment.get('post') पर कॉल करना होगा। यही एक उलटा है। यह वर्णन करता है कि अलग-अलग वस्तुएं एक ही रिश्ते को संदर्भित करती हैं। अलग नाम, एक ही किनारे। स्पष्ट रूप से उलटा घोषित करके, आप एक वस्तु को बताते हैं कि अन्य ऑब्जेक्ट किनारे को कॉल करता है।

यह महत्वपूर्ण क्यों है? खैर, एम्बर-डेटा को यह जानने की जरूरत है कि यह संबंधों का सहारा दे सकता है। उदाहरण के लिए, मान लें कि आपके पास निम्न कोड है:

var post = store.find('post', '1'); 
var newComment = store.createRecord('comment', {}); 

... 

post.get('comments').addObject(newComment); 

आपने जो किया वह एक नई टिप्पणी बना रहा है और इसे किसी मौजूदा पोस्ट ऑब्जेक्ट से कनेक्ट कर रहा है। एक साधारण पर्याप्त उपयोग मामले। लेकिन एक समस्या है: आपने केवल टिप्पणी के बारे में पोस्ट को बताया, इसके विपरीत नहीं। आपने पोस्ट को बताया कि आपने टिप्पणी को जोड़ा है, लेकिन आपने टिप्पणी नहीं दी कि आपने इसे पर पोस्ट किया है। लेकिन एक उपयोगकर्ता के रूप में, आप उम्मीद करते हैं कि दोनों एक ही समय में हों। खैर, वे करते हैं, और ऐसा इसलिए है क्योंकि एम्बर-डेटा आपके लिए करता है। व्यस्त संबंधों के नामों का उपयोग करते हुए, एम्बर-डेटा सुनिश्चित करता है कि जब आप एक करते हैं, तो दूसरा भी होता है।आप ऐसा करते हैं जब:

post.get('comments').addObject(newComment); 

एंबर-डाटा, पर्दे के पीछे, वास्तव में करता है: है

post.get('comments').addObject(newComment); 
newComment.set('post', post); 

यही कारण है कि एंबर-डाटा व्युत्क्रम संबंध की जरूरत है: तो यह बिना अखंडता को बनाए रखने कर सकते हैं आपको इसके बारे में चिंता करने की ज़रूरत है।

+9

अब इसे पूरी तरह से समझें - बहुत बहुत धन्यवाद। मुझे लगता है कि एम्बर डॉक्स एक बेहतर उदाहरण का इस्तेमाल कर सकते थे। – ncksllvn

+0

अच्छा स्पष्टीकरण – sarmahdi

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