如何定义多态关联?

时间:2015-02-24 10:14:56

标签: ruby-on-rails ember.js ember-data ember-cli

我正在尝试设置多态关联。不幸的是,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,这将返回MemberProfileGuestProfile对象。

我应该如何在客户端(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 })
});

1 个答案:

答案 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.jsguest-profile.js会链接到user,而不是profile来模仿您的Rails代码。< / p>