使用sails.js v0.10.0-rc7,我想保存一个用户和他的朋友。
我想我需要以某种方式创建一个多对多的关联从一个模型到它自己?这可能吗?
User.js:
module.exports = {
attributes: {
name: {
type: 'string'
},
friends: {
collection: 'user',
via: ?
}
}
};
我使用帆船mysql,如果它的关系。我发现了这个问题,它是相关的,但没有解决我的问题:https://github.com/balderdashy/waterline/issues/410
谢谢!
更新:到目前为止,我找到了两种方法,但都使用冗余数据:
选项1
根据hansmei的建议:
module.exports = {
attributes: {
id:{
type: 'integer',
autoIncrement: true,
primaryKey: true
},
name: {
type: 'string'
},
friends: {
collection: 'user',
via: 'id'
}
}
}
这需要我拯救每段友谊两次:
User.findOne(1).exec(function (err, user) {
user.friends.add(2);
...
User.findOne(2).exec(function (err, user) {
user.friends.add(1);
...
选项2
attributes: {
name: {
type: 'string'
},
friends: {
collection: 'user',
via: 'friendOf',
dominant: true
},
friendOf:{
collection:'user',
via:'friends'
}
}
这也是多余的,因为友谊总是相互的。(如果用户A是用户B的朋友,那么用户B一定是用户A的朋友)
有什么建议吗?
我已经设法以这种方式与self建立关联(至少对于本地磁盘存储)。它应该也适用于MySQL
用户模式:module.exports = {
attributes: {
id:{
type: 'integer',
autoIncrement: true,
primaryKey: true
},
name: {
type: 'string'
},
friends: {
collection: 'user',
via: 'id'
}
}
}
我不确定这是否是一个有效的多对多关系,但我认为你可以调整它,使它为你工作:)
这是我想在我的主干解决的问题。帆插件(直到水线整理)。
我已经完全重写了Sails的蓝图,包括支持自我引用许多对许多关联。在模型定义中,您只需要采用所需的约定:
/api/模型/Person.coffee
module.exports =
attributes:
friends:
collection: "person"
via: "_friends"
dominant: true
_friends:
collection: "person"
via: "friends"
上面,friends
属性是要持久化的集合。当通过蓝图持久化时,_friends
收集将镜像friends
收集,模仿所做的任何添加或删除请求-这意味着friends
收集将是一个相互关系,而不需要任何额外的客户端代码。
你可以在这里下载蓝图。没有这个插件的前端部分,它们也能很好地工作(尽管你需要编译它们或npm install coffee-script
)。只要将它们包含在/api/blueprints文件夹中,风帆(0.10)就会把它们捡起来。
虽然我知道这个解决方案远非理想,但它似乎是目前最好的解决方案(特别是如果您对所有持久性使用蓝图)。一个更好的解决方法是生命周期回调——但是它们不适用于.add(id)
和.remove(id)
函数。