Я с удовольствием использую бета-версию Sailsjs v0.10, и меня беспокоил один вопрос, касающийся ассоциаций «многие ко многим»:
Скажем, Model-A и Model-B имеют ассоциацию «многие ко многим» через два атрибута. API рекомендует использовать метод «добавить» для добавления одного существующего объекта Model-A к коллекции другого объекта Model-B с последующим вызовом метода «save» модели-B для внесения изменений. стойкий. Это работает, как и ожидалось, но в документации также упоминается следующее о методе сохранения:
«Это метод экземпляра. В настоящее время методы экземпляра НЕ ЯВЛЯЮТСЯ ТРАНЗАКЦИОННЫМИ. Поэтому вместо этого рекомендуется использовать метод эквивалентной модели».
Но, к сожалению, вызов Model-B-update не сохраняет изменения в коллекциях в отношениях «многие ко многим». Поскольку я НЕ эксперт в базах данных, я не уверен, что это ошибка, особенность или недоразумение с моей стороны. Любые предложения очень приветствуются!
Бен
Изменить: вот более подробное описание моей проблемы:
Скажем, у нас есть две модели: User и Group:
/**
* User.js
*
module.exports = {
attributes: {
[...]
memberOfGroups: {
collection: 'group',
via: 'members'
}
};
/**
* Group.js
*
module.exports = {
attributes: {
[...]
members:
{
collection: 'user',
via: 'memberOfGroups',
dominant: true
}
}
};
Как видите, между этими двумя моделями существует связь «многие ко многим». Предположим, есть два экземпляра, по одному каждой модели. Один называется aliceUser, другой — publicGroup. Мы хотим добавить aliceUser в качестве члена в publicGroup.
Когда я делаю
publicGroup.members.add(aliceUser.id);
publicGroup.save(function(err, saved) { ... });
Я получаю ожидаемые результаты, aliceUser становится членом publicGroup:
{
"members": [
{
"email": "[email protected]",
"name": "alice",
"id": 4,
"createdAt": "2014-06-23T22:20:01.967Z",
"updatedAt": "2014-06-23T22:20:01.967Z"
}
],
"name": "public",
"createdAt": "2014-06-23T22:19:57.489Z",
"updatedAt": "2014-06-23T22:20:01.983Z",
"id": 1
}
Теперь это все удовлетворительно, но в документе говорится о методе сохранения, что он не является транзакционным, что, возможно, приводит к тому, что я не синхронизируюсь с пользователем и группой. Документ продолжается:
По этой причине вместо этого рекомендуется использовать метод эквивалентной модели.
Честно говоря, я не уверен на сто процентов, что они имеют в виду, я предположил, что команда парусов имела в виду использование метода Group.update().
Но если я сделаю
publicGroup.members.add(aliceUser.id); /*same as before*/
Group.update(publicGroup.id, publicGroup, function(err, updated) {
[...]
});
aliceUser не добавлен в качестве члена publicGroup:
{
"members": [],
"name": "public",
"createdAt": "2014-06-23T22:19:57.489Z",
"updatedAt": "2014-06-23T22:20:01.983Z",
"id": 1
}
Надеюсь, это объясняет мою текущую проблему более подробно. Если вам нужна дополнительная информация, пожалуйста, скажите мне об этом. Большое спасибо за ваше время!