Sailsjs使用非事务性保存的多对多关联

时间:2014-06-23 11:20:15

标签: many-to-many associations sails.js waterline

我很高兴使用Sailsjs的beta v0.10,我担心一个关于多对多关联的问题:

Say,Model-A和Model-B通过两个属性进行多对多关联。 API建议使用" add" -method将一个现有的Model-A-object附加到另一个Model-B-object的集合,然后调用" save" - Model-B的方法,使变化持久。这可以按预期工作,但文档还提到了有关save-method的以下内容:

"这是一个实例方法。目前,实例方法不是交易的。因此,建议您使用等效的模型方法。"

但不幸的是,对Model-B-update的调用并没有在多对多关系中保留集合中的更改。 由于我不是数据库方面的专家,如果这是一个错误,一个功能或我的误解,我是不安全的。 任何建议都非常欢迎!

编辑:以下是我的问题的更详细说明:

说,我们有两个模型,用户

/**
* 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": "alice@cc.com",
            "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
}

现在这一切都令人满意,但是文档说明了save-method,它不是事务性的,可能会让我的用户和组失去同步。文件继续:

  

因此,建议您改用等效的模型方法。

说实话,我不是百分百肯定,他们的意思是什么,我猜测帆团队指的是使用 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
}

希望这能更详细地解释我当前的问题。如果您需要更多信息,请告诉我。非常感谢你的时间!

1 个答案:

答案 0 :(得分:0)

Transactional是一个数据库思考和意思: - 如果您在具有多个表的数据库中有更新,则如果更新的某个部分不起作用,则数据库软件会自动回滚。

例如,这对银行账户很有用。要将资金从一个银行帐户转移到另一个银行帐户,您必须更新2个项目(更新银行帐户1套币=钱-100&&更新银行帐户2套币=金币+100)。如果其中一个更新失败,则数据库会进行回滚(因此钱不会消失)。

阅读详情:http://en.wikipedia.org/wiki/Database_transaction

对于Waterline(风帆的orm),这意味着:如果你想制作事务性的数据库更新,你必须使用query()或native() - 方法。