У меня есть следующие модели в моем приложении Sailsjs с многие-ко-многим:Добавить несколько записей в коллекции модели Sailsjs
event.js:
attributes: {
title : { type: 'string', required: true },
description : { type: 'string', required: true },
location : { type: 'string', required: true },
maxMembers : { type: 'integer', required: true },
currentMembers : { collection: 'user', via: 'eventsAttending', dominant: true },
creator : { model: 'user', required: true },
invitations : { collection: 'invitation', via: 'eventID' },
tags : { collection: 'tag', via: 'taggedEvents', dominant: true },
lat : { type: 'float' },
lon : { type: 'float' },
},
tags.js:
attributes: {
tagName : { type: 'string', unique: true, required: true },
taggedEvents : { collection: 'event', via: 'tags' },
},
Основываясь на документации, это соотношение выглядит правильно. У меня есть следующий метод в tag.js, который принимает массив строк тегов и идентификатор события, и предполагается, что добавить или удалить тег, которые были переданы в:
modifyTags: function (tags, eventId) {
var tagRecords = [];
_.forEach(tags, function(tag) {
Tag.findOrCreate({tagName: tag}, {tagName: tag}, function (error, result) {
tagRecords.push({id: result.id})
})
})
Event.findOneById(eventId).populate('tags').exec(function(error, event){
console.log(event)
var currentTags = event.tags;
console.log(currentTags)
delete currentTags.add;
delete currentTags.remove;
if (currentTags.length > 0) {
currentTags = _.pluck(currentTags, 'id');
}
var modifiedTags = _.pluck(tagRecords, 'id');
var tagsToAdd = _.difference(modifiedTags, currentTags);
var tagsToRemove = _.difference(currentTags, modifiedTags);
console.log('current', currentTags)
console.log('remove', tagsToRemove)
console.log('add', tagsToAdd)
if (tagsToAdd.length > 0) {
_.forEach(tagsToAdd, function (tag) {
event.tags.add(tag);
})
event.save(console.log)
}
if (tagsToRemove.length > 0) {
_.forEach(tagsToRemove, function (tagId) {
event.tags.remove(tagId)
})
event.save()
}
})
}
Это как называется метод от модели событий:
afterCreate: function(record, next) {
Tag.modifyTags(tags, record.id)
next();
}
Когда я отправляю к событию/создание, я получаю этот результат: http://pastebin.com/PMiqBbfR.
Похоже, что вызов метода зацикливается, а не только тегиToAdd или tagsToRemove. Что более смущает то, что в конце, в последнем журнале события, похоже, что у события есть правильные теги. Однако, когда я отправляю сообщение в event/1, массив тегов пуст. Я также попытался сэкономить сразу после каждого .add()
, но все равно получаю аналогичные результаты.
В идеале, я хотел бы зациклиться на тегахToAdd и tagsToRemove массивов, изменить их идентификаторы в коллекции модели, а затем вызвать .save()
один раз на модели.
Я потратил кучу времени, пытаясь отладить это, поэтому любая помощь будет принята с благодарностью!
Спасибо за помощь. У меня было ощущение, что это связано с асинхронными методами, основанными на том, что я нашел в Интернете. Я все еще очень новичок в асинхронных/синхронных методах и обратных вызовах, и, после принятия вашего предложения, я все еще получаю ошибки и немного смущен. Я задал следующий вопрос здесь: http://stackoverflow.com/questions/25800157/add-multiple-records-to-models-collection-sailsjs-followup – CitizenKen