2015-02-24 80 views
2

我想設置一個多態關聯。不幸的是,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 }) 
}); 

回答

2

你說得對,Ember Docs似乎缺乏。我認爲除了你已經提到的DS.belongsTo('profile', { polymorphic: true, async: true })之外,沒有太多的東西。

一種選擇是延長一個檔案類:

// 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的多態關聯最佳實踐的相關討論:http://discuss.emberjs.com/t/cleaner-way-to-define-polymorphic-associations/6369

作爲一個側面說明,member-profile.jsguest-profile.js會鏈接到user在你的JavaScript代碼,而不是profile來模仿你的Rails代碼。