I'm trying to create a many to many association between two models, Operator and Group.
Two two models are:
-Operator.js
var Operator = {
connection:'postgresql',
tableName: 'operator',
schema:true,
attributes: {
firstName: {
type: 'string',
required: true,
max: 64,
columnName: 'first_name'
},
lastName: {
type: 'string',
required: true,
max: 64,
columnName: 'last_name'
},
birthDate: {
type: 'date',
columnName: 'birth_date'
},
sex: {
type: 'string',
enum: ['M', 'F', 'N.A.'],
columnName: 'sex'
},
email: {
type: 'email',
required: true,
columnName: 'email'
},
login: {
type: 'string',
required: true,
max: 64
},
password: {
type: 'string',
required: true
},
createdAt: {
columnName: 'created_at'
},
updatedAt: {
columnName: 'updated_at'
},
groups:{
collection:'group',
via:'operators'
},
// Override toJSON instance method
// to remove password value
toJSON: function() {
var obj = this.toObject();
delete obj.password;
return obj;
}
},
// Lifecycle Callbacks
beforeCreate: function(values, next) {
bcrypt.hash(values.password, 10, function(err, hash) {
if(err) return next(err);
values.password = hash;
next();
});
}
};
module.exports = Operator;
-Group.js
var bcrypt = require('bcrypt');
var Group = {
connection:'postgresql',
tableName: 'group',
schema:true,
attributes: {
name: {
type: 'string',
required: true,
unique:true,
columnName: 'name'
},
createdAt: {
columnName: 'created_at'
},
updatedAt: {
columnName: 'updated_at'
},
operators:
{
collection:'operator',
via:'groups',
dominant:true
}
}
};
module.exports = Group;
I created the join table group_operators__operator_groups that has the two columns group_operators and operator_groups.
On sails console I tried to make the association with this command:
Operator.find(149).populate('groups').exec(function(e,r){
console.log(e);
r[0].groups.add(19);
console.log(r[0]);
r[0].save(function(err){
console.log(err);})
});
But in the result an error appeared:
null
{ groups: [],
sex: 'F',
email: 'nhjfhry@t5rjyi.girtj',
login: 'tryjrtyh',
password: '$2a$10$3pOYcOpWWcU868LBB0Gki./n9nrooXyDqSNYz1NJCkvQ480KT5uxO',
id: 149,
firstName: 'fgterier',
lastName: 'gdfgjdi',
birthDate: Thu Sep 25 2014 00:00:00 GMT+0200 (CEST),
createdAt: null,
updatedAt: Thu Oct 02 2014 12:45:14 GMT+0200 (CEST) }
[ { type: 'insert',
collection: 'group_operators__operator_groups',
criteria: { group_operators: 19, operator_groups: 149 },
values: { group_operators: 19, operator_groups: 149 },
err: [Error: Trying to '.add()' an instance which already exists!] } ]
Possibly unhandled Error: [object Object]
at Object.Promise$_rejecter [as reject] (/usr/lib/node_modules/sails/node_modules/waterline/node_modules/bluebird/js/main/promise.js:601:58)
at /usr/lib/node_modules/sails/node_modules/waterline/lib/waterline/model/lib/defaultMethods/save.js:154:16
at /usr/lib/node_modules/sails/node_modules/waterline/node_modules/async/lib/async.js:454:17
at /usr/lib/node_modules/sails/node_modules/waterline/node_modules/async/lib/async.js:444:17
at Array.forEach (native)
at _each (/usr/lib/node_modules/sails/node_modules/waterline/node_modules/async/lib/async.js:46:24)
at Object.taskComplete (/usr/lib/node_modules/sails/node_modules/waterline/node_modules/async/lib/async.js:443:13)
at processImmediate [as _immediateCallback] (timers.js:345:15)
If I don't create the Join Table and I try to make the association,sails console returns this error:
Error (E_UNKNOWN) :: Encountered an unexpected error
error: relation "group_operators__operator_groups" does not exist
at Connection.parseE (/home/valentina/workspace/xtens-app/node_modules/sails- postgresql/node_modules/pg.js/lib/connection.js:534:11)
at Connection.parseMessage (/home/valentina/workspace/xtens-app/node_modules/sails-postgresql/node_modules/pg.js/lib/connection.js:361:17)
at Socket.<anonymous> (/home/valentina/workspace/xtens-app/node_modules/sails-postgresql/node_modules/pg.js/lib/connection.js:105:22)
at Socket.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:764:14)
at Socket.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:426:10)
at emitReadable (_stream_readable.js:422:5)
at readableAddChunk (_stream_readable.js:165:9)
at Socket.Readable.push (_stream_readable.js:127:10)
Details: error: relation "group_operators__operator_groups" does not exist
I'm using sails 0.10.5, sails-postgresql ^0.10.8 and postgresql 9.3.4.
Should I create the join table? What is the problem? The join table is empty, so the association doesn't exist.
Thank you!
Valentina
I don't think you can name a table group in postgresql since it will conflict with the internal database table. You can try renaming the tableName to 'groups' in the Model. If that does not work, you may try this
Operator model //Operator.js
.
.
.
groups:{
collection:'group',
via:'id'
},
.
.
Group model
//Groups.js
.
.
operators:
{
collection:'operator',
via:'id',
dominant:true
}
.
.