SailsJS 协会

SailsJS association

我正在尝试与两个模型建立关联:

用户 -> 模块

我的用户模型:

module.exports = {
  tableName: 'user',
  autoCreatedAt: false,
  autoUpdatedAt: false,
  attributes: {
    username: {
      type: 'string',
      required: true,
      size: 45
    },
    password: {
      type: 'string',
      required: true,
      size: 45
    },
    firstname: {
      type: 'string',
      required: true,
      size: 45
    },
    lastname: {
      type: 'string',
      required: true,
      size: 45
    },
    grades: {
      type: 'json',
      defaultsTo:[]
    },
    ....

模块型号:

module.exports = {
  tableName: 'module',
  autoCreatedAt: false,
  autoUpdatedAt: false,
  attributes: {

    name: {
      type: 'string',
      required:true
    },

    spec_id: {
      type: 'integer',
      required: true,
      enum: [1, 2, 3, 4]
    },

  }
};

用户集合如下:

{
    "_id": {
        "$oid": "58763b49458a93f4785fff0e"
    },
    "grades": [
        {
            "grade": 7.5,
            "mod_id": "587686a4f36d284ed588d72c",
            "try": 1
        },
        {
            "grade": 6.4,
            "mod_id": "587686a4f36d284ed588d72c",
            "try": 2
        }
    ],
    "role_id": "58766274734d1d50c512f493",
    "class_id": "58768634f36d284ed588d6e6",
    "spec_id": "587686a4f36d284ed588d72c",
    "username": "-",
    "password": "-",
    "firstname": "-",
    "lastname": "-",
    "email": "test@test.nl",
    "birthdate": "1995-05-1995",
    "_csrf": "null"
}

我用来记录以上结果的查询:

var findOneUser = User.find();
findOneUser.where({id: req.session.userID});
findOneUser.populateAll()
findOneUser.exec(function callBack(err,user){
      var singleUser = user.pop().toJSON();
      console.log(singleUser);
 });

我怎样才能在我的模型中实现以下目标(使用 user.grades.mod_id 作为连接键),所以在我的每个 中都有一个 module 对象成绩 个对象(我正在使用 MongoDB)

    {
  "_id": {
    "$oid": "58763b49458a93f4785fff0e"
  },
  "grades": [
    {
      "grade": 7.5,
      "module": {
        "name": "bla",
        "description": "-",
        "spec_id": 1
      },
      "try": 1
    },
    {
      "grade": 6.4,
      "module": {
        "name": "bla",
        "description": "-",
        "spec_id": 1
      },
      "try": 2
    }
  ],
  "role_id": "58766274734d1d50c512f493",
  "class_id": "58768634f36d284ed588d6e6",
  "spec_id": "587686a4f36d284ed588d72c",
  "username": "-",
  "password": "-",
  "firstname": "-",
  "lastname": "-",
  "email": "test@test.nl",
  "birthdate": "-",
  "_csrf": "null"
}

我看到了很多嵌套关联;但我认为这有点不同,也发现了这个.. sails.js nested models 有点相似,但与这个例子相比,我想加入 [=38= 中的值] JSON 对象.

不容易理解你哪里有问题,因为在查看文档后很简单。

在User.js型号中:

mod_id: {
model: 'module' // or modules depends how you have it declared
}

在 Module.js 型号中:

users: {
collection: 'user',
via: 'mod+id'
}

有两种方法可以解决这个问题:

创建一个单独的成绩模型。它将单独存储在 MongoDB 中(不以首选方式使用 Mongo)

或者在获取用户后编写代码填充模块

User.findOne(1).exec(function(err, user) {
  user = user.toJSON();
  var moduleIds = _.map(user.grades, 'mod_id');

  Module.find(moduleIds).exec(function(err, modules) {
    _.forEach(user.grades, function(grade) {
      var module = _.find(modules, { 'id': grade.mod_id });
      grade.module = module;
    });
    console.log('User', user);
    return;
  });
});