我正在尝试设置多态关联。不幸的是,Ember文档并没有很好地涵盖这一点。
我的API(Rails)具有以下定义:
class User < ActiveRecord::Base
belongs_to :profile, polymorphic: true#, dependent: :destroy
end
class MemberProfile < ActiveRecord::Base
has_one :user, as: :profile, dependent: :destroy
end
class GuestProfile < ActiveRecord::Base
has_one :user, as: :profile, dependent: :destroy
end
这意味着,在Rails控制台中,我可以执行User.last.profile
,这将返回MemberProfile
或GuestProfile
对象。
我应该如何在客户端(Ember)定义它?
// app/models/user.js
import DS from 'ember-data';
export default DS.Model.extend({
profile: DS.belongsTo('profile', { polymorphic: true, async: true })
});
// app/models/member-profile.js
import DS from 'ember-data';
export default DS.Model.extend({
profile: DS.belongsTo('profile', { polymorphic: true, async: true })
});
// app/models/guest-profile.js
import DS from 'ember-data';
export default DS.Model.extend({
profile: DS.belongsTo('profile', { polymorphic: true, async: true })
});
答案 0 :(得分:2)
你是对的,Ember Docs似乎缺乏。除了你已经概述过的DS.belongsTo('profile', { polymorphic: true, async: true })
之外,我认为它没有多大意义。
一种选择是扩展Profile类:
// Standard Ember code - use export/import conventions for ember-cli
App.Profile = DS.Model.extend({
// Attributes here, maybe a reference to the related User
});
App.MemberProfile = App.Profile.extend({
// Member-specific attributes
});
App.GuestProfile = App.Profile.extend({
// Guest-specific attributes
});
App.User = DS.Model.extend({
profile: DS.belongsTo('profile', {polymorphic: true, async: true})
});
这将允许您执行someUser.get('profile')
,并使返回的值为成员或来宾。它基于以下代码提供:http://www.toptal.com/emberjs/a-thorough-guide-to-ember-data#the-ember-data-value-proposition
您也可以在需要它的情况下创建类似形式的Mixins。
今年早些时候,Ember论坛上有关于使用Ember多态关联的最佳实践的相关讨论:http://discuss.emberjs.com/t/cleaner-way-to-define-polymorphic-associations/6369
作为旁注,在您的javascript代码中,member-profile.js
和guest-profile.js
会链接到user
,而不是profile
来模仿您的Rails代码。< / p>