ポリモーフィックな関連付けと残り火データの答えを思いついた人はいますか?
私が言えることから、関係のもう一方の端にあるタイプを照会できる何らかの方法が必要になります。
誰かこれについて何か考えはありますか?
ポリモーフィックな関連付けと残り火データの答えを思いついた人はいますか?
私が言えることから、関係のもう一方の端にあるタイプを照会できる何らかの方法が必要になります。
誰かこれについて何か考えはありますか?
だから私は何かを持っています。完成していないか、完全にきれいではありませんが、機能します。基本的に、私はミックスインを使用して、Emberアソシエーションを完全にバイパスします。これはアダプターまたはストアにロールインできると確信していますが、今のところこれは機能します。
ポリモーフィックモデルは、itemIdとitemTypeを使用してJSONを介して提供されます。
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')
ミックスインは3つのメソッドを実装します。1つはchangeCountを更新し、もう1つはモデルのタイプを返し、polymorphicFilterメソッドはitemTypeとidでモデルをフィルタリングします。
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')
バインディングが確実に起動するように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()
それは私が今のところ持っているものです。アダプターレイヤーから1ステップだけ削除されているため、モデルレイヤーに物事を保持しようとしています。Ember Dataが将来的にポリモーフィックをまったく調べないように見える場合は、これをすべてより高いレベルに引き上げることは理にかなっていますが、今のところ、これは機能し、コントローラーを(比較的)クリーンなままにします。
ポリモーフィック アソシエーションが ember データでサポートされるようになりました
https://github.com/emberjs/data/commit/e4f7c3707217c6ccc0453deee9ecb34bd65c28b9