4

更新されたデータベース アダプター (PostgreSQL 用) を使用して Sails.js のベータ版 (v0.10.0-rc3) を実行しているため、Waterline ORM を介した関連付けの機能を利用できます。さまざまなアクセス レベルに応じて、承認用のロール ベースのユーザー モデルを作成しようとしています。ユーザーとロールの関連付けは 1 対多です。私のモデルは次のとおりです。

API/モデル/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/モデル/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 がスルー アソシエーションをまだサポートしていないことは知っていますが、ユーザーに関連付けられたロール名には引き続きアクセスできるはずですよね? 例:user.role.name現在のところ、ロール名を取得できた唯一の方法は、ロール オブジェクトに対して 2 番目のクエリを実行することです。

4

1 に答える 1

3

関連付けられたモデルにアクセスするにはpopulate、プライマリ モデルをクエリするときに関連付けを行う必要があります。次に例を示します。

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

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

}

協会のドキュメントはこちらです。

于 2014-03-20T17:19:07.060 に答える