2014-11-19 15 views
6

Sails.js (v0.10.5) ve Waterline ORM konusunda yeniyim. Ben veritabanında 3 tablo var: kullanıcılar (id, isim), roller (id, alias) ve tablo user_roles (user_id, role_id) birleştirme. Tablo isimlerini ve alan adlarını veritabanında değiştirmemek önemlidir. Politika varlığının Kullanıcı ve Rol arasındaki bir katılım varlığı olmasını istiyorum. İşte bazı haritalama kodudur:Sails.js + Waterline: İlişkilendirmeden çok kişilere

//User.js 
module.exports = { 
    tableName: 'users', 
    autoCreatedAt: false, 
    autoUpdatedAt: false, 
    attributes: { 
     id: { 
      type: 'integer', 
      required: true 
     }, 
     name: { 
      type: 'string' 
     }, 
     roles: { 
      collection: 'role', 
      via: 'users', 
      through: 'policy' 
     }, 
    } 
} 

//Role.js 
module.exports = { 
    tableName: "roles", 
    autoCreatedAt: false, 
    autoUpdatedAt: false, 
    attributes: { 
     id: { 
      type: 'integer', 
      required: true 
     }, 
     alias: { 
      type: 'string', 
      required: true 
     }, 
     users: { 
      collection: 'user', 
      via: 'roles', 
      through: 'policy' 
     } 
    } 
} 

//Policy.js 
module.exports = { 
    tableName: "users_roles", 
    tables: ['users', 'roles'], 
    junctionTable: true, 
    autoCreatedAt: false, 
    autoUpdatedAt: false, 
    attributes: { 
     user: { 
      columnName: 'user', 
      type: 'integer', 
      foreignKey: true, 
      references: 'user', 
      on: 'id', 
      via: 'role', 
      groupBy: 'user' 
     }, 
     roles: { 
      columnName: 'role', 
      type: 'integer', 
      foreignKey: true, 
      references: 'role', 
      on: 'id', 
      via: 'user', 
      groupBy: 'role' 
     } 
    } 
} 

Ama erişmeye çalışırken rolleri denetleyicisi içinde bağladıkları

User.findOne({id: 1}).populate('roles').exec(function(err, user) { 
    console.log(JSON.stringify(user.roles)); 
}); 

bu döndürür

[] 

Ve

User.findOne({id: 1}).populate('roles').exec(function(err, user) { 
    console.log(JSON.stringify(user)); 
}); 

döner

{"id":1,"name":"test", "roles":[]} 

İki kez, kullanıcı aralarında rol ve ilişkilerinin veritabanında bulunduğunu kontrol ettim. Benim hatam nedir

+0

sen Can lütfen kodu geçmiş misiniz? User.find() doldurduğunuzdan emin olun ('roller'). Exec (işlev() {}) –

+0

@ mandeep_m91 Cevabınız için teşekkür ederiz! Soruyu düzenledim (console.log çıktısında bazı hatalar vardı). –

+1

Bunu çözebildiniz mi? Eğer değilse, hangi db kullanıyorsunuz? –

cevap

4

Bu sorunu çözmenin bir yolunu buldum. Tam olarak istediğim şey değil, ama işe yarıyor. İlk: katılmak varlık: Gördüğünüz gibi

//Policy.js 
module.exports = { 
    tableName: "users_roles", 
    autoPK: false, 
    attributes: { 
     id: { 
      type: 'integer', 
      primaryKey: true, 
      autoIncrement: true, 
     }, 
     user: { 
      columnName: 'user_id', 
      model: 'user' 
     }, 
     role: { 
      columnName: 'role_id', 
      model: 'role' 
     } 
    }, 
    //tricky method to get all users for specified role_id 
    //or to get all roles for specified user_id 
    get: function(id, modificator, cb) { 
     var fields = ['user', 'role']; 
     if (fields.indexOf(modificator) < 0) { 
      cb(new Error('No such modificator in Policy.get()'), null); 
     } 
     var inversedField = fields[(fields.indexOf(modificator) + 1) % 2]; 
     var condition = {}; 
     condition[inversedField] = id; 
     this.find(condition).populate(modificator).exec(function(err, policies) { 
      if (err) { 
       cb(err, null); 
       return; 
      } 
      var result = []; 
      policies.forEach(function(policy) { 
       result.push(policy[modificator]); 
      }); 
      cb(null, result); 
      return; 
     }); 
    } 
} 

, bu varlığa kimliği alanı eklendi (ve masa users_roles çok db) büyük çözüm değil yani.

//User.js 
module.exports = { 
    tableName: 'users', 
    autoPK: false, 
    attributes: { 
     id: { 
      type: 'integer', 
      primaryKey: true, 
      autoIncrement: true, 
      unique: true, 
     }, 
     name: { 
      type: 'string' 
     }, 
     policies: { 
      collection: 'policy', 
      via: 'user' 
     } 
    } 
} 

Ve Rol Varlık: Ben Belirtilen user_id için tüm rolleri almak nasıl

//Role.js 
module.exports = { 
    tableName: 'roles', 
    autoPK: false, 
    attributes: { 
     id: { 
      type: 'integer', 
      primaryKey: true, 
      autoIncrement: true, 
     }, 
     alias: { 
      type: 'string', 
      required: true, 
      unique: true, 
     }, 
     policies: { 
      collection: 'policy', 
      via: 'role' 
     } 
    } 
} 

:

... 
id = req.session.me.id; //user_id here 
Policy.get(id, 'role', function(err, roles) { 
    var isAdmin = false; 
    roles.forEach(function(role) { 
     isAdmin |= (role.id === 1); 
    }); 
    if (isAdmin) { 
     next(null); 
     return; 
    } else { 
     return res.redirect('/login'); 
    }   
}); 
... 

Belki birileri için yararlı olacak =)

+0

neredeyse 2 yıl sonra Benim için yararlı oldu! Teşekkürler! –

İlgili konular