2015-05-02 6 views
6

Ich bin ziemlich neu auf Nodejs und Segel. Ich implementiere einen Server, der Twitter ähnlich ist. Im Benutzermodell sollte es 2 Felder geben: Follower und Follower, und die 2 Felder sind die Assoziation des Modells 'Benutzer' selbst.Sails.js Modell: create 2 Assoziation zu selbst fehlgeschlagen

Meine Frage ist, wenn das Modell nur 1 Assoziation, entweder Follower oder folgende haben, funktioniert es. Wenn jedoch sowohl Folger als auch Folgender enthalten sind, würde ein Fehler auftreten.

Der Code ist so etwas wie dieses:

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

Der Code wird ein solcher Fehler verursachen:

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

Wie werden Sie Ihre Modelle in dem Controller-Code bevölkern? Wenn Sie populateAll() nicht verwenden, geben Sie einen Attributnamen für populate() ein? –

+0

@AlexAlksne Ich bevölkere so: 'User.find ({alias: item.alias}). Populate ('Follower'). Exec (console.log);' Eigentlich definiere ich nur 'Following', benutze es auch nie . Dann melden die Segel den Fehler beim Abheben. –

+0

Seltsam, alles scheint korrekt zu sein. Ich bin so ratlos; Es ist nicht viel, aber wenn Sie sich die Zeile anschauen, die den Fehler in references.js verursacht, hat sie folgenden Kommentar: "Wenn keine übereinstimmenden Attribute gefunden werden, geben Sie einen Fehler aus, weil Sie versuchen, ein hasMany-Attribut zu einem Modell hinzuzufügen habe keinen Fremdschlüssel, der der Sammlung entspricht. " –

Antwort

3

Für eine solche Verwendung Modell Definition falsch ist, nämlich die via Schlüsselwörter. Gemäß der waterline associations docs verweist das Stichwort via auf die andere Seite der Vereinigung. Also, für eine follower ist die andere Seite following und umgekehrt. Mit anderen Worten:

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

können Sie prüfen, ein vollständiges Arbeitsbeispiel an: https://github.com/appscot/sails-orientdb/blob/master/test/integration-orientdb/tests/associations/manyToMany.selfReferencing.js

+0

Danke für dein Beispiel. Es ist definitiv was ich brauche. Aber ich denke, dass es in einigen Situationen das gleiche Problem geben sollte. Überlegen Sie, es gibt 2 Gruppen definiert, eine ist Jungs, die er hasst, und eine andere ist Jungs, die er liebt. So sollte das Modell dies mag: '{ \t alias: 'string' \t Hass: { \t \t Sammlung: 'user', \t \t über: 'alias' \t}, \t love: { \t \t Sammlung: 'user', \t \t über: 'alias' \t} } ' es wird das gleiche Problem verursachen, wird es nicht? Wie kann ich es vermeiden? –

+0

Ich denke, Sie müssen 2 verschiedene selbstverweisende Assoziationen erstellen. Ein Verein wäre "loves"/"lovedBy" und ein anderer wäre "hates"/"hatedBy". Ich hoffe, das hilft! –

+0

Wirklich hilfreich. Vielen Dank ~~. :-) –

Verwandte Themen