【问题标题】:How to create new Sails model from an existing model如何从现有模型创建新的 Sails 模型
【发布时间】:2014-11-03 13:17:35
【问题描述】:

我是 Sails 的新手,正在创建一个简单的应用程序。
我现在卡在数据模型上。
User 模型如下:

module.exports = {

attributes: {
    firstName: {
        type: 'string'
    },
    lastName: {
        type: 'string'
    },
    email: {
        type: 'email',
        required: true
    },

    password: {
        type: 'String'
    },
    passwordSalt: {
     type: 'String'
    },
    projects:{
     collection: 'ProjectMember',
     via: 'userId'
    }
  }
};  

我还需要一个名为TinyUser 的模型,它从用户那里获取一些属性(比如用户的外键),这样我就可以访问TinyUser 而不是直接访问User。
TinyUser 模型如下:

module.exports = {  
 tableName: 'User',  
  attributes: {  
    firstName:{  
     type: 'string'  
    },  
    lastName: {  
      type: 'string'
  },
  email: {
      type: 'email'
  }  
}  
};  

ProjectMember 模型如下:

module.exports = {

attributes: {

    projectId: {
        model: 'Project'
    },
    userId: {
        model: 'TinyUser'
    },
    projectRole: {
        model: 'ProjectRole'
    },

}  
};  

在 Sails 中,无论如何我可以在 TinyUser 中保存数据,而无需实际创建,而只是保存用户表数据的一些属性?

为了清楚起见,如果有另一个名为 Task 的表并且它正在尝试访问用户数据,那么 TinyUser 作为模型而不是 User 是更好的选择,因为它只保存必需的信息。用于任务而不是存储用户所做的所有其他字段。

有什么办法可以解决这个问题吗? 提前致谢

【问题讨论】:

    标签: node.js mongodb sails.js data-modeling waterline


    【解决方案1】:

    您的意思是您需要从“用户”模型继承“TinyUser”吗?

    你可以这样做。

    /api/services/baseUserModel.js:

    module.exports = {
    
      attributes: {
        firstName: 'string',
        lastName: 'string',
        email: {
          type: 'email',
          required: true
        },
        password: 'string',
        passwordSalt: 'string',
        projects: {
          collection: 'ProjectMember',
          via: 'userId'
        }
      }
    };

    /api/models/TinyUser.js:

    var baseUserModel = require('../services/baseUserModel'),
      _ = require('lodash');
    
    module.exports = _.merge({
      tableName: 'User',
      attributes: {
        firstName: 'string',
        lastName: 'string',
        email: {
          type: 'email',
          required: true
        }
      }
    }, baseUserModel);

    ProjectMember 模型应该是:

    module.exports = {
    
      attributes: {
    
        projectId: {
          model: 'project'
        },
        userId: {
          model: 'tinyuser'
        },
        projectRole: {
          model: 'projectrole'
        }
    
      }
    };

    【讨论】:

    • 我在尝试此操作时遇到以下错误:错误:尝试将集合属性与没有外键的模型相关联。 tinyuser 正在尝试在 References.findReference 处引用 projectmember 中的外键 .... 知道为什么会出现此错误吗?
    • 能否提供“ProjectMember”模型的代码,需要注意的一点是“ProjectMember.js”内部的关联属性应该是这样的:userid: {model: 'tinyuser'},。请参考official doc
    • 我已经用 ProjectMember 模型更新了我的问题,错误仍然相同,用户正在尝试引用项目成员中的外键。
    • 我也更新了答案,请尝试用小写更改参考模型名称
    • 我试过小写,但还是不行。我找到了这个链接groups.google.com/forum/#!topic/sailsjs/5YSR0qfyLFU,它告诉我们继承在 Sails .10.x 中不起作用。您使用的是 Sails 10.x 吗?
    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 2013-10-14
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多