2015-02-24 4 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, который будет возвращать либо 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 }) 
}); 

ответ

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 в ситуации, требующей его.

Был родственное обсуждение на форумах Поста в начале этого года, связанные с наилучшей практикой с использованием полиморфных ассоциаций Эмбера: http://discuss.emberjs.com/t/cleaner-way-to-define-polymorphic-associations/6369

в качестве побочного сведению, в вашем яваскрипте коды member-profile.js и guest-profile.js бы связать с user, а не profile, чтобы имитировать код Rails.

Смежные вопросы