Thinky ORM + RethinkDB - 多对多关系

Posted

技术标签:

【中文标题】Thinky ORM + RethinkDB - 多对多关系【英文标题】:Thinky ORM + RethinkDB - Many to many relationships 【发布时间】:2014-08-21 03:29:12 【问题描述】:

我在使 n-n 关系在 Thinky 中工作时遇到问题:

这是定义模型的代码:

module.exports = function(thinky)
  var User = thinky.createModel("User",
    SNIP: A Bunch of properties
  );

  User.hasAndBelongsToMany(User,"friends","id","id");

  return User;

这是添加朋友的路线。:

router.route('/user/:user_id/addFriend')
  .post(function(req,res)
    User.get(req.params.user_id).run().then(function(user)
      User.get(req.body.id).run().then(function(friend)
        if(!user.friends)
          user.friends = [friend];
        else
          user.friends.push(friend);
        
        user.saveAll().then(function(result)
          res.json(user:result);
        );
      );   
    ,function(err)
      console.log(err);
      res.status(400).json(error:err);
    );
  );

addFriend 路由返回的结果有好友,但是当我稍后检索用户时,关系无处可见。如果我查看 RethinkDB Data Explorer thinky 已经为关系创建了 User_User 表,并且其中包含以下数据:

[

"id":  "8f08de10-6f3c-486e-958a-cb0e05b79244_de484182-5aab-4773-a374-e0ba292f7f80" ,
"id_id": [
"de484182-5aab-4773-a374-e0ba292f7f80" ,
"8f08de10-6f3c-486e-958a-cb0e05b79244"
]

]

但 Thinky 拒绝认为这种关系是存在的。我做错了什么?

【问题讨论】:

【参考方案1】:

因为一个用户链接到另一个用户,你可以有一个循环引用(user1 是 user1 的朋友)。 在这种情况下,为避免出现诸如超出最大堆栈大小之类的错误,thinky 不会继续递归,而是需要您手动指定要保存的内容。

这应该可行:

user.saveAll(friends: true).then(function(result)
  res.json(user:result);
);

【讨论】:

不幸的是,这似乎仍然不起作用。当我检索用户时,user.friends 仍未定义。 你用user.getJoin(friends: true)检索它吗?出于同样的原因(循环引用),您需要强制 thinky 检索此关系。

以上是关于Thinky ORM + RethinkDB - 多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu 上卸载 RethinkDB?

RethinkDB:​​更新文档

Rethinkdb复制和数据一致性

RethinkDB:​​根据过滤字段过滤文档

socket.io vs RethinkDB changefeed

rethinkdb - hasFields 查找具有多个多个缺失条件的所有文档