我很高兴使用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
}
希望这能更详细地解释我当前的问题。如果您需要更多信息,请告诉我。非常感谢你的时间!
答案 0 :(得分:0)
Transactional是一个数据库思考和意思: - 如果您在具有多个表的数据库中有更新,则如果更新的某个部分不起作用,则数据库软件会自动回滚。
例如,这对银行账户很有用。要将资金从一个银行帐户转移到另一个银行帐户,您必须更新2个项目(更新银行帐户1套币=钱-100&&更新银行帐户2套币=金币+100)。如果其中一个更新失败,则数据库会进行回滚(因此钱不会消失)。
阅读详情:http://en.wikipedia.org/wiki/Database_transaction
对于Waterline(风帆的orm),这意味着:如果你想制作事务性的数据库更新,你必须使用query()或native() - 方法。