2014-11-19 20 views
6

Sono nuovo su Sails.js (v0.10.5) e Waterline ORM. Ho 3 tabelle nel database: utenti (id, nome), ruoli (id, alias) e join table users_roles (user_id, role_id). È importante non modificare i nomi delle tabelle e i nomi dei campi nel database. Voglio che l'entità politica sia un'entità di join tra Utente e Ruolo. Ecco alcuni codice di mappatura:Sails.js + Waterline: Many-to-Many tramite associazione

//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' 
     } 
    } 
} 

Ma quando si tenta di accedere ruoli atribute controller

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

questo restituisce

[] 

E

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

rendimenti

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

Ho controllato due volte che l'utente, il ruolo e l'associazione tra loro esiste nel database. Qual è il mio errore?

+0

Can voi per favore, oltre il codice? Assicurati di utilizzare User.find(). Populate ('roles'). Exec (function() {}) –

+0

@ mandeep_m91 grazie per la tua risposta! Ho modificato la domanda (c'erano alcuni errori nell'output di console.log). –

+1

Sei riuscito a risolvere questo? In caso contrario, quale db sottostante stai usando? –

risposta

4

Ho trovato il modo di risolvere questo problema. Non è quello che voglio esattamente, ma funziona. Primo: unire entità:

//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; 
     }); 
    } 
} 

Come potete vedere, ho aggiunto campo ID di questa entità (e al db users_roles tavolo troppo), quindi non è la grande soluzione.

//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' 
     } 
    } 
} 

e il ruolo di entità:

//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' 
     } 
    } 
} 

Ecco come ottenere tutti i ruoli per user_id specificato:

... 
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'); 
    }   
}); 
... 

Forse sarà utile per qualcuno =)

+0

quasi 2 anni dopo E 'stato utile per me! Grazie! –

Problemi correlati