2012-07-12 123 views
13

有人想出了多態關聯和餘燼數據的答案嗎?Ember-數據多態關聯

我們需要某種方式能夠從我所知道的關係的另一端查詢類型。

有人對此有何看法?

+0

你能不能給你想要做什麼具體的例子信息? – pangratz 2012-07-12 18:14:52

+0

我希望能夠有這樣的東西: JSON:{...「attachedTo」:{「user_id」:16} ...} 和在模型定義: attachedTo:DS.belongsTo( 「auto」) – 2012-09-27 03:37:05

回答

3

所以我有一些東西。它沒有完成,或完全乾淨,但它的工作原理。基本上,我使用mixin完全繞過Ember關聯。我確定這可以放入適配器或商店中,但現在可以使用。

多態性車型都通過了JSON用的itemId和項目類型:

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

我添加混入到與它相關的機型:

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') 

的混入實現了三種方法,一個更新changeCount,一個返回模型的類型和通過itemType和id過濾模型的polymorphicFilter方法:

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() 

這是我到目前爲止所。我試圖將東西保留在模型層中,因爲它只是從適配器層中刪除了一個步驟。如果看起來Ember Data未來將不再考慮多態性,那麼將這一切都提升到更高層次是有意義的,但是現在,這可以起作用並使我的控​​制器(相對)保持乾淨。現在

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

我遇到了一個問題,當一個模型有多個多態關聯時 - Post可以是可註釋的,可連接的和可通知的 - 您是否遇到過這個問題?我已經通過讓每個「多態」模型從最後一個擴展來解決它,但這意味着我無法控制每個模型上顯示的屬性。 – 2013-06-20 09:20:38

+0

想知道'hasMany'用'{id:1,type:'type'}'對象代替ID的原因,而belongsTo將這個注入到父對象中嗎?如果它們是相同的,它會更清潔。 'comment:{id:1,message:{id:1,type:'post'}}' – Joe 2014-11-19 20:14:34