2014-10-02 63 views
7

我試圖創建兩個模型之間的多對多關聯,運營商和組。sails postgresql多對多協會不起作用

兩個兩款車型分別是:

-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; 

我創建的連接具有兩個group_operators和operator_groups表group_operators__operator_groups。

在帆控制檯我試圖讓與此相關聯的命令:

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

但結果時出現的錯誤:

null 
    { groups: [], 
    sex: 'F', 
    email: '[email protected]', 
    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) 

如果我沒有創建連接表和我嘗試使關聯,帆控制檯返回此錯誤:

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 

我使用的風帆0.10.5,sails-pos tgresql^0.10.8和postgresql 9.3.4。

我應該創建連接表嗎? 問題是什麼?連接表爲空,所以關聯不存在。

謝謝!

瓦倫蒂娜

+0

這是崩潰帆? – sgress454 2014-10-02 18:09:44

+0

不,這不會導致Sails崩潰。帆正在工作。 – 2014-10-03 06:43:02

回答

0

我不認爲你可以命名PostgreSQL中的表組,因爲它會與內部數據庫表衝突。您可以嘗試將模型中的tableName重命名爲'groups'。如果不工作, 您可以嘗試這個

操作模式 //Operator.js

. 
. 
. 
    groups:{ 
     collection:'group', 
     via:'id' 
    }, 
. 
. 

組模型

//Groups.js 

. 
. 
    operators: 
     { 
     collection:'operator', 
     via:'id', 
     dominant:true 
    } 
. 
.