首页 文章

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

提问于
浏览
1

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

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

“这是一个实例方法 . 目前,实例方法不是TRANSACTIONAL . 因此,建议您使用等效的模型方法 . ”

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

编辑:这里是我的问题的更详细的描述:

说,我们有两个模型, UserGroup

/**
* 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

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

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

    阅读更多:http://en.wikipedia.org/wiki/Database_transaction

    对于Waterline(风帆的orm),这意味着:如果要创建事务性的数据库更新,则必须使用query()或native() - 方法 .

相关问题