我很高兴使用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的调用并没有在多对多关系中保留集合中的更改 . 因为我不是数据库方面的专家,所以如果这是一个错误,一个功能或我的误解,我是不安全的 . 任何建议都非常欢迎!
本
编辑:这里是我的问题的更详细的描述:
说,我们有两个模型, 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": "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 回答
Transactional是一个数据库思考和意思: - 如果您在具有多个表的数据库中有更新,则数据库软件会在更新的某个部分不起作用时自动回滚 .
这对银行账户很有用 . 要将资金从一个银行帐户转移到另一个银行帐户,您必须更新2个项目(更新银行帐户1设置金钱=金钱-100 &&更新银行帐户2设置金钱=金钱100) . 如果其中一个更新失败,数据库会进行回滚(因此钱不会消失) .
阅读更多:http://en.wikipedia.org/wiki/Database_transaction
对于Waterline(风帆的orm),这意味着:如果要创建事务性的数据库更新,则必须使用query()或native() - 方法 .