2015-05-02 14 views
6

Sono abbastanza nuovo su Nodejs e vele. Sto implementando un server che è simile a Twitter. Nel modello utente, ci dovrebbero essere 2 campi: follower e following, ei 2 campi sono associazione del modello 'user' stesso.Modello Sails.js: crea 2 associazione a fallita autonoma

La mia domanda è quando il modello ha solo 1 associazione, follower o seguente, funziona. Tuttavia, quando inclusi sia follower che following, ci sarebbe un errore.

Il codice è qualcosa di simile:

module.exports = { 
    attributes: { 
    alias: { 
    type:'string', 
    required: true, 
    primaryKey: true 
    }, 
    pwd: { 
    type: 'string', 
    required: true 
    }, 
    follower: { 
     collection: 'user', 
     via: 'alias' 
    }, 
    following:{ 
     collection: 'user', 
     via: 'alias' 
    } 
} 

Il codice causerà tale errore:

usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/waterline-schema/lib/waterline-schema/references.js:115 
throw new Error('Trying to associate a collection attribute to a model tha 
    ^
Error: Trying to associate a collection attribute to a model that doesn't have a Foreign Key. user is trying to reference a foreign key in user 
at References.findReference (/usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/waterline-schema/lib/waterline-schema/references.js:115:11) 
at References.addKeys (/usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/waterline-schema/lib/waterline-schema/references.js:72:22) 
+0

Come si popolano i vostri modelli nel codice di controllo? Se non si usa populateAll(), si fornisce un nome di attributo a populate()? –

+0

@AlexAlksne I popola in questo modo: 'User.find ({alias: item.alias}). Populate ('follower'). Exec (console.log);' In realtà, definisco semplicemente 'following', anche non lo uso mai . Quindi le vele riportano l'errore durante la vita. –

+0

Strano, tutto sembra corretto. Sono perplesso finora; non è molto, ma se si guarda la linea che sta causando l'errore in references.js ha questo commento: "Se non vengono trovati attributi corrispondenti, genera un errore perché si sta tentando di aggiungere un attributo hasMany a un modello in cui l'associazione non avere una chiave esterna corrispondente alla collezione. " –

risposta

3

Per tale uso la vostra definizione del modello è corretto, vale a dire le via parole chiave. Come da waterline associations docs, la parola chiave via fa riferimento all'altro lato dell'associazione. Quindi, per un follower l'altro lato è following e viceversa. In altre parole:

follower: { 
    collection: 'user', 
    via: 'following' 
}, 
following:{ 
    collection: 'user', 
    via: 'follower' 
} 

È possibile controllare un esempio di lavoro completo a: https://github.com/appscot/sails-orientdb/blob/master/test/integration-orientdb/tests/associations/manyToMany.selfReferencing.js

+0

Grazie per il tuo esempio. È sicuramente quello di cui ho bisogno. Ma penso che ci dovrebbe essere lo stesso problema in alcune situazioni. Consideriamo che ci sono 2 gruppi definiti, uno è ragazzi che odia e un altro è ragazzi che ama. Così il modello dovrebbe in questo modo: '{ \t alias: 'stringa' \t odio: { \t \t collezione: 'utente', \t \t via: 'alias' \t}, \t amore: { \t \t collezione: 'utente', \t \t via: 'alias' \t}} ' causerà lo stesso problema, non è vero? Come posso evitarlo? –

+0

Penso che avrai bisogno di creare 2 distinte associazioni autoreferenziali. Un'associazione sarebbe 'loves' /' lovedBy' e un'altra sarebbe 'hates' /' hatedBy'. Spero possa aiutare! –

+0

Davvero utile. Grazie mille ~~. :-) –

Problemi correlati