js模型-创建到self的关联



使用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)函数。

相关内容

  • 没有找到相关文章

最新更新