Ассоциации Sailsjs «многие ко многим» с использованием нетранзакционного сохранения

Я с удовольствием использую бета-версию 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
}

Надеюсь, это объясняет мою текущую проблему более подробно. Если вам нужна дополнительная информация, пожалуйста, скажите мне об этом. Большое спасибо за ваше время!


person user3767102    schedule 23.06.2014    source источник


Ответы (1)


Транзакционная база данных думает и означает: - Если у вас есть обновление в базе данных с более чем одной таблицей, программное обеспечение базы данных автоматически выполняет откат, если одна часть обновления не работает.

Это полезно, например, для банковских счетов. Чтобы перевести деньги с одного банковского счета на другой, вы должны обновить 2 элемента (обновить банковский счет 1, установить деньги = деньги -100 и обновить банковский счет 2, установить деньги = деньги +100). Если одно из обновлений не удалось, база делает откат (чтобы деньги не пропали).

Подробнее читайте на странице: http://en.wikipedia.org/wiki/Database_transaction.

Для Waterline (форма парусов) это означает: если вы хотите делать обновления базы данных, которые являются транзакционными, вы должны использовать методы query() или native().

person mdunisch    schedule 23.06.2014
comment
Хм, я пытался использовать методы запроса: скажем, у меня есть модель User: attributes: { memberOfGroups: { collection: 'group', via: 'members' } } и модель Group: attributes: { members: { collection: 'user', via: 'memberOfGroups', dominant: true }, } и два экземпляра aliceUser, publicGroup. Я сделал publicGroup.members.add(aliceUser.id); Теперь publicGroup.save(...) работает (не транзакционный), а Group.update(publicGroup.id, ...) нет (должен быть транзакционным). Может быть, я использую обновление неправильно? - person user3767102; 23.06.2014
comment
не могли бы вы поместить код дыры как отредактировать в своем вопросе в формате? Также, пожалуйста, опишите проблему подробнее (что вы ожидали, что на самом деле произошло)? - person mdunisch; 23.06.2014
comment
Я отредактировал свой исходный вопрос, спасибо, что уделили время - person user3767102; 24.06.2014