Проблема с созданием экземпляра модели и применением его к определенному ключу в Ember Mirage

#ember.js #ember-data #ember-cli-mirage

#ember.js #ember-данные #ember-cli-mirage

Вопрос:

При создании экземпляра StaffMember в ember-cli-mirage я пытаюсь создать «задачу» и назначить ее ключу «tasksCreated» в модели StaffMember. Мой текущий код выглядит следующим образом;

Он создает задачу и создает сотрудника, но между ними нет отношений.

app/models/staff-member.js

 import DS from 'ember-data';

export default DS.Model.extend({
    name: DS.attr('string'),
    atWork: DS.attr('boolean'),
    avatar: DS.attr(),
    tasksCreated: DS.hasMany('task', {
        inverse: 'creator'
    }),
    tasksAssigned: DS.hasMany('task', {
        inverse: 'assignee'
    })
});
  

app/models/tasks.js

 import DS from 'ember-data';

export default DS.Model.extend({
    creator: DS.belongsTo('staff-member', { inverse: null }),
    assignee: DS.belongsTo('staff-member', { inverse: null }),
    creationDate: DS.attr(),
    description: DS.attr('string'),
    urgency: DS.attr()
 });
  

mirage/models/staff-member.js

 import {Model, hasMany} from 'ember-cli-mirage';

export default Model.extend({
    tasksCreated: hasMany('task'),
    tasksAssigned: hasMany('task', { inverse: 'assignee'})
});
  

mirage/models/task.js

 import {Model, belongsTo} from 'ember-cli-mirage';

export default Model.extend({
    creator: belongsTo('staff-member'),
    assignee: belongsTo('staff-member')
});
  

mirage/factories/staff-member.js

 import { Factory, faker, trait } from 'ember-cli-mirage';

export default Factory.extend({
    name: faker.name.firstName,
    atWork: faker.random.boolean,
    avatar: faker.image.avatar,
    withTasks: trait({
        afterCreate(staffMember, server){
            server.createList('task',2,{tasksCreated: [staffMember]});
        }
    })
});
  

mirage/factories/task.js

 import { Factory, faker } from 'ember-cli-mirage';

export default Factory.extend({
    creationDate: faker.date.recent,
    description: faker.lorem.sentence,
    urgency: faker.random.number({
        'min': 0,
        'max': 4
    })
});
  

mirage/scenarios/default.js

 export default function(server ) {  

    server.createList('staff-member', 4, 'withTasks');

}
  

Ответ №1:

Я попытался удалить большую часть кода, который не был напрямую связан с настройкой отношений. Прежде чем возиться с фабриками, попробуйте заставить отношения работать только в сценарии по умолчанию.

Я сделал рабочий поворот здесь: https://ember-twiddle.com/5bcdcdee50faa0c0a679c3c4d35fe0ea?openFiles=mirage.scenarios.default.js,

Вот как выглядит сценарий по умолчанию:

 export default function(server ) {  

  let member1 = server.create('staff-member');
  server.createList('task', 2, { creator: member1 });
  server.create('task', { assignee: member1 });


  let member2 = server.create('staff-member');
  server.create('task', { creator: member2 });
  server.createList('task', 3, { assignee: member2 });
}
  

Что касается вашего заводского afterCreate кода, в этой строке есть одна ошибка

 server.createList('task',2,{tasksCreated: [staffMember]});
  

Вы создаете task , но передаете tasksCreated как свойство этой задачи. Но у задач нет свойства tasksCreated, у staffMembers есть. Может быть, что-то вроде этого — это то, что вы ищете:

 server.createList('task', 2, { creator: staffMember });