从 Sails.js 中的关联模型访问模型的属性

Posted

技术标签:

【中文标题】从 Sails.js 中的关联模型访问模型的属性【英文标题】:Accessing a model's attributes from an associated model in Sails.js 【发布时间】:2014-04-27 11:14:03 【问题描述】:

我正在使用更新的数据库适配器(用于 PostgreSQL)运行 Sails.js 的 beta 版本(v0.10.0-rc3),以便我具有通过 Waterline ORM 进行关联的功能。我正在尝试根据不同的访问级别创建基于角色的用户模型进行授权。用户到角色关联是一对多的。我的模型是:

api/models/User.js

module.exports = 

  attributes: 
    firstName: 
      type: 'string',
      required: true
    ,
    lastName: 
      type: 'string',
      required: true
    ,
    fullName: function() 
      return this.firstName + " " + this.lastName;
    ,
    email: 
      type: 'email',
      required: true,
      unique: true
    ,
    encryptedPassword: 
      type: 'string'
    , 
    role: 
      model: 'role'
    ,
    groups: 
      collection: 'group',
      via: 'users'
    
  ,  

  toJSON: function() 
    var obj = this.toObject();
    delete obj.password;
    delete obj.confirmation;
    delete obj._csrf;
    return obj;
  ,

  beforeCreate: function (values, next) 
    // Makes sure the password and password confirmation match
    if (!values.password || values.password != values.confirmation) 
      return next(err: ['Password does not match password confirmation.']);
    

    // Encrypts the password/confirmation to be stored in the db
    require('bcrypt').hash(values.password, 10, function passwordEncrypted(err, encryptedPassword) 
      values.encryptedPassword = encryptedPassword;

       next();
    );
  
;

api/models/Role.js

module.exports = 

  attributes: 
    name: 
      type: 'string',
      required: true,
      unique: true
    ,
    users: 
      collection: 'user',
      via: 'role'
    ,
    permissions: 
      collection: 'permission',
      via: 'roles',
      dominant: true
    
  
;

我知道 Waterline 还不支持 Through Associations,但我仍然应该能够访问与用户关联的角色名称,对吗?例如:user.role.name 到目前为止,我能够检索角色名称的唯一方法是对角色对象进行第二次查询。

【问题讨论】:

【参考方案1】:

为了访问关联模型,您必须在查询主模型时populate 关联,例如:

User.findOne(1).populate('role').exec(function(err, user) 

    if (err) throw new Error(err); 
    console.log(user.role.name);


Associations 文档是 here。

【讨论】:

以上是关于从 Sails.js 中的关联模型访问模型的属性的主要内容,如果未能解决你的问题,请参考以下文章

Sails.js:MySQL 中缺少水线外键关联

Sails.js 对关联值的查询

Sails.js 填充嵌套关联

Sails.js - 如何对具有数组类型属性的模型进行本机查询?

如何自动解析 Sails.js 路由上的模型属性?

如何在sails.js 模型中添加具有整数数据类型数组的属性?