【问题标题】:Sailsjs many-to-many associations using non-transactional saveSailsjs 使用非事务性保存的多对多关联
【发布时间】:2014-06-23 11:20:15
【问题描述】:

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

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

“这是一个实例方法。目前,实例方法不是事务性的。因此,建议您改用等效模型方法。”

但不幸的是,对 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
}

现在这一切都令人满意,但文档说明了保存方法,它不是事务性的,可能会让我的用户和组不同步。文档继续:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    Transactional 是一种数据库思维方式: - 如果您在包含多个表的数据库中有更新,如果更新的一部分不起作用,数据库软件会自动回滚。

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

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

    对于 Waterline(帆的形式),这意味着:如果要进行事务性数据库更新,则必须使用 query() 或 native() 方法。

    【讨论】:

    • 嗯,我尝试使用查询方法:假设我有一个模型 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, ...) 不是(应该是事务性的)。也许我使用更新错误?
    • 您能把孔代码作为编辑格式放在您的问题中吗?还请进一步描述问题(您期望什么,实际发生了什么)?
    • 我编辑了我原来的问题,感谢您抽出宝贵时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2016-11-03
    • 2023-03-16
    相关资源
    最近更新 更多