有没有人想出多态关联和余烬数据的答案?
我们需要某种方式来查询关系另一端的类型。我可以告诉你。
有人对此有任何想法吗?
答案 0 :(得分:8)
使用最新的ember-data构建,您现在可以使用多态关联:
您需要配置模型以使其具有多态性:
/* 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
RESTAdapter
属性
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"
}
}
中的更多信息
答案 1 :(得分:3)
所以我有一些东西。它没有完成,或者完全干净,但它确实有效。基本上,我使用mixin完全绕过Ember协会。我确信这可以卷入适配器或商店,但现在可行。
多态模型通过带有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实现了三个方法,一个更新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')
除了必须调用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将来根本不会考虑多态,那么将这一切都提升到更高的水平是有意义的,但是现在,这样可以使我的控制器(相对)干净。
答案 2 :(得分:2)