Thinky ORM + RethinkDB — отношения «многие ко многим»

У меня проблемы с работой отношений 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 отказывается видеть отношения как существующие. Что я делаю не так?


person Marc Mailhot    schedule 21.08.2014    source источник


Ответы (1)


Поскольку пользователь связан с другим пользователем, у вас может быть циклическая ссылка (пользователь 1 является другом пользователя 1). В этом случае, чтобы избежать такой ошибки, как превышение максимального размера стека, thinky не повторяется и требует, чтобы вы вручную указали, что вы хотите сохранить.

Это должно работать:

user.saveAll({friends: true}).then(function(result){
  res.json({user:result});
});
person neumino    schedule 21.08.2014
comment
К сожалению, это все еще не работает. Когда я получаю пользователя, user.friends остается неопределенным. - person Marc Mailhot; 22.08.2014
comment
Вы получаете его с помощью user.getJoin({friends: true})? По той же причине (циклические ссылки) вам нужно заставить thinky получить это отношение. - person neumino; 22.08.2014