【问题标题】:How to define a polymorphic association?如何定义多态关联?
【发布时间】:2015-04-25 21:56:44
【问题描述】:

我正在尝试设置多态关联。不幸的是,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 })
});

【问题讨论】:

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


    【解决方案1】:

    你说得对,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

    在需要的情况下,您也可以创建类似形式的 Mixin。

    今年早些时候在 Ember 论坛上进行了与使用 Ember 多态关联的最佳实践有关的相关讨论:http://discuss.emberjs.com/t/cleaner-way-to-define-polymorphic-associations/6369

    附带说明一下,在您的 javascript 代码中,member-profile.jsguest-profile.js 将链接到 user,而不是 profile,以模仿您的 Rails 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多