2013-11-26 5 views
2

У меня есть три модели: Компании, Person и задачи. В компании много людей. У человека есть одна компания. У компании много задач. У человека много задач.полиморфные отношений в Ember-данных

Соотношения задач являются полиморфными.

Вот мои модели

App.Taskable = DS.Model.extend({ 

    tasks: DS.hasMany('task') 
}); 

App.Task = DS.Model.extend({ 

    subject: DS.attr('string'), 

    taskable: DS.belongsTo('taskable', { polymorphic: true}) 
}); 

App.Person = App.Taskable.extend({ 

    firstName: DS.attr('string'), 

    lastName: DS.attr('string'), 

    email: DS.attr('string'), 

    company: DS.belongsTo('company'), 

    fullName: function() { 
    return this.get('firstName') + ' ' + this.get('lastName'); 
    }.property('firstName', 'lastName') 

}); 

App.Company = App.Taskable.extend({ 

    name: DS.attr('string'), 

    people: DS.hasMany('person') 
}); 

Обратите внимание, что лицо и Компания продлить Taskable. Я считаю, что эти отношения определены правильно. Я не знаю, как лениво загружать задачи.

Вот мой взгляд человек

<script type="text/x-handlebars" data-template-name='show/_person'> 
    <div> 
    <form class="form-horizontal" role="form"> 
     <div class="form-group"> 
     <label class="col-sm-2 control-label">Name</label> 
     <div class="col-sm-10"> 
      <p class="form-control-static">{{fullName}}</p> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label class="col-sm-2 control-label">Company</label> 
     <div class="col-sm-10"> 
      <p class="form-control-static">{{company.name}}</p> 
     </div> 
     </div> 
     <div class="form-group"> 
     <label class="col-sm-2 control-label">Tasks</label> 
     <div class="col-sm-10"> 
      <p class="form-control-static"> 
      {{#each task in tasks}} 
      {{task.subject}}<br /> 
      {{/each}} 
      </p> 
     </div> 
     </div> 
    </script> 

Запрос GET выдается для компании, связанной с человеком, но никакой запрос не делается для задач. Как я могу получить задания, связанные с человеком или компанией? Я ожидаю, что запрос GET будет сделан на people/3/tasks или что-то подобное

ответ

4

Я думаю, что только ActiveModelAdapter внедрили полиморфную ассоциацию.

Чтобы получить эту работу вам необходимо использовать следующий формат:

GET /tasks

{ 
    tasks: [ 
     { 
      id: 1, 
      subject: 'Mytask1', 
      // in the polymorphic association we need to say the type and the id 
      taskable: { type: "person", id: 1 } 
     }, 
     { 
      id: 2, 
      subject: 'Mytask2', 
      taskable: { type: "company", id: 1 } 
     } 
    ] 
} 

GET /tasks/1

{ 
    task: { 
     id: 1, 
     subject: 'Mytask1', 
     // in the polymorphic association we need to say the type and the id 
     taskable: { type: "person", id: 1 } 
    } 
} 

Я обновил свой образец в скрипку, пожалуйста, дайте посмотреть http://jsfiddle.net/marciojunior/7k7RT/

+0

спасибо, что отлично работает. Тем не менее, мне не нравится, как task_ids необходимо вернуть с помощью модели person. Что делать, если у меня есть тысяча задач, связанных с человеком? Возвращение их всех вместе со своей моделью не будет работать в этом масштабе – David

+1

Добро пожаловать. Я не вижу проблемы с task_ids, потому что это просто массив чисел. Существует другая возможность для загрузки задач, вы можете использовать 'links: {tasks: '/ tasks/1'}' в своей полезной нагрузке, где задачи - это ваше свойство, а «/ tasks/1» - это конечная точка, где эти данные могут быть загружен. Дайте посмотреть в/people/1 mock, этой скрипки http://jsfiddle.net/marciojunior/Bm3Jy/ –

+0

блестящий. 'links' - это то, что я хочу. Спасибо! – David

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