2012-07-12 15 views
13

किसी बहुरूपी संघों और एंबर-डेटा के लिए एक जवाब के साथ आ गया है?एंबर-डेटा बहुरूपी संघों

हम मैं क्या बता सकता से संबंध के दूसरे छोर पर प्रकार क्वेरी करने के लिए सक्षम होने का किसी तरह की आवश्यकता होगी।

किसी ने इस पर कोई विचार?

+0

तुम क्या आप क्या करना चाहते का एक विशिष्ट उदाहरण दे सकते हैं में जानकारी? – pangratz

+0

मैं कुछ ऐसा करने में सक्षम होना चाहता हूं: JSON: {... "attachTo": {"user_id": 16} ...} और मॉडल परिभाषा में: संलग्न करने के लिए: DS.belongsTo ("ऑटो") –

उत्तर

3

तो मैं कुछ है। यह खत्म नहीं हुआ है, या पूरी तरह से साफ है, लेकिन यह काम करता है। असल में, मैं पूरी तरह से एम्बर संघों को बाईपास करने के लिए एक मिश्रण का उपयोग करता हूं। मुझे यकीन है कि इसे एडाप्टर या स्टोर में घुमाया जा सकता है, लेकिन अभी यह काम करता है।

बहुरूपी मॉडल एक Itemid और itemtype साथ JSON के माध्यम से आते हैं:

App.Follow = DS.Model.extend 
    user: DS.belongsTo('App.User') 
    itemId: DS.attr("number") 
    itemType: DS.attr("string") 

मैं मॉडल है कि यह साथ जुड़े रहे हैं करने के लिए एक mixin जोड़ें:

App.Hashtag = DS.Model.extend App.Polymorphicable, 
    follows:(-> 
    name: DS.attr("string") 
    @polymorphicFilter(App.Follow, "Hashtag") 
).property('changeCount') #changeCount gives us something to bind to 

    followers: (-> 
    @get('follows').map((item)->item.get('user')) 
).property('follows') 

mixin तीन तरीकों को लागू करता है, एक जो चेंज काउंटर अपडेट करता है, जो मॉडल के प्रकार और पॉलीमोर्फिकफिल्टर विधि को देता है जो आइटम टाइप और आईडी द्वारा मॉडल फ़िल्टर करता है:

App.Polymorphicable = Ember.Mixin.create 
    changeCount: 1 

    polymorphicFilter: (model, itemType)-> 
    App.store.filter model, 
     (data) => 
     if data.get('itemId') 
      @get('id') is data.get('itemId').toString() and data.get('itemType') is itemType 

    itemType:()-> 
    @constructor.toString().split('.')[1] 

    updatePolymorphicRelationships:()-> 
    @incrementProperty('changeCount') 

नियंत्रक परत यह सब jankyness से सुरक्षित है, सुनिश्चित करें कि बाइंडिंग आग बनाने के लिए updatePolymorphicRelationship कॉल करने के लिए होने के लिए छोड़कर:

App.HashtagController = Ember.ObjectController.extend 
    follow:()-> 
    App.Follow.createRecord({ 
     user: @get('currentUserController.content') 
     itemId: @get('id') 
     itemType: @get('content').itemType() 
    }) 
    #this provides a way to bind and update. Could be refactored into a didSave() 
    #callback on the polymorphic model. 
    @get('content').updatePolymorphicRelationships() 
    App.store.commit() 

है यही कारण है कि मैं अब तक की है। मैं चीजों को मॉडल परत में रखने की कोशिश कर रहा हूं क्योंकि यह एडाप्टर परत से केवल एक कदम हटा दिया गया है। अगर ऐसा लगता है कि एम्बर डेटा भविष्य में पॉलिमॉर्फिक्स को देखने के लिए नहीं जा रहा है, तो यह सब एक उच्च स्तर तक खींचने के लिए समझ में आता है, लेकिन अभी के लिए, यह मेरे नियंत्रकों (अपेक्षाकृत) साफ करता है और छोड़ देता है।

8
नवीनतम एंबर-डेटा के साथ

निर्माण अब आप बहुरूपी संघों का उपयोग कर सकते हैं:

आप इसे बहुरूपी बनाने के लिए अपने मॉडल विन्यस्त करने की जरूरत:

/* polymorphic hasMany */ 
App.User = DS.Model.extend({ 
messages: DS.hasMany(App.Message, {polymorphic: true}) 
}); 

App.Message = DS.Model.extend({ 
    created_at: DS.attr('date'), 
    user: DS.belongsTo(App.User) 
}); 

App.Post = App.Message.extend({ 
    title: DS.attr('string') 
}); 

/* polymorphic belongsTo */ 
App.Comment = App.Message.extend({ 
    body: DS.attr('string'), 
    message: DS.belongsTo(App.Message, {polymorphic: true}) 
}); 

आप भी अपनीपर alias गुण विन्यस्त करने की जरूरत

DS.RESTAdapter.configure('App.Post' { 
    alias: 'post' 
}); 
DS.RESTAdapter.configure('App.Comment' { 
    alias: 'comment' 
}); 

परिणाम आपके सर्वर से उम्मीद इस तरह होना चाहिए:

{ 
    user: { 
     id: 3, 
     // For a polymorphic hasMany 
     messages: [ 
      {id: 1, type: "post"}, 
      {id: 1, type: "comment"} 
     ] 
    }, 

    comment: { 
     id: 1, 
     // For a polymorphic belongsTo 
     message_id: 1, 
     message_type: "post" 
    } 
} 

अधिक this github thread

+0

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

+0

'हैनी' ने किसी आईडी को {{id: 1, टाइप: 'टाइप'} 'ऑब्जेक्ट के साथ बदल दिया है, जबकि एक संबंधित है, इसे मूल ऑब्जेक्ट में इंजेक्ट करता है? यदि वे वही थे, तो यह बहुत साफ होगा, उदा। 'टिप्पणी: {आईडी: 1, संदेश: {आईडी: 1, टाइप: 'पोस्ट'}}' – Joe

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