Sailsjs和协会

时间:2014-03-29 18:01:05

标签: sails.js

进入sails.js - 享受模型,路线和最近添加的关联的清洁度。我的困境:

我有用户和群组。两者之间有很多关系。

var User = {
  attributes: {
    username: 'string',
    groups: {
        collection: 'group',
        via: 'users'
    }
  }
};

module.exports = User;

...

var Group = {
    attributes: {
        name: 'string',
        users: {
            collection: 'user',
            via: 'groups',
            dominant: true
        }
    }
};

module.exports = Group;

我很难理解如何保存用户及其相关群组。

我可以直接访问“加入表”吗?

从ajax调用中,我应该如何将组ID列表发送到我的控制器?

如果通过REST URL,这是否已通过更新在蓝图功能中考虑?

如果是这样 - 网址是什么样的? / user / update / 1?groups = 1,2,3?

所有这些都不支持吗?任何见解都很有帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

这些蓝图的文档即将发布,但要链接两个具有多对多关联的记录,您可以使用以下REST URL:

POST /user/[userId]/groups

帖子的正文是:

{id: [groupId]}

假设idGroup模型的主键。从v0.10-rc5开始,您还可以通过在POST正文中发送有关新组的数据,同时创建一个新组并向用户添加新组,而不是id:

{name: 'myGroup'}

目前,您一次只能添加一个链接的实体。

要以编程方式添加实体,请使用add方法:

User.findOne(123).exec(function(err, user) {

   if (err) {return res.serverError(err);}

   // Add group with ID 1 to user with ID 123
   user.groups.add(1);
   // Add brand new group to user with ID 123
   user.groups.add({name: 'myGroup'});

   // Save the user, committing the additions
   user.save(function(err, user) {
      if (err) {return res.serverError(err);}
      return res.json(user);
   });
});           

答案 1 :(得分:0)

回答关于直接访问联接表的问题,

是的,如果您使用的是Model.query函数,则可以这样做。您需要从DB本身检查连接表的名称。不确定是否推荐,但我发现自己有时会遇到不可避免的情况。

有些时候我试图实现的逻辑涉及很多查询,并且需要作为原子事务执行。

在这种情况下,我将所有DB逻辑封装在一个存储的函数中,并使用Model.query

执行该逻辑。
var myQuery = "select some_db_function(" + <param> + ")";

Model.query(myQuery, function(err, result){
  if(err) return res.json(err);
  else{
    result = result.rows[0].some_db_function;
    return res.json(result);
  }
});
由于json数据类型允许我将params作为JSON传递并且还将值作为JSON返回

,因此postgres在这里提供了很大的帮助。