2015-05-02 23 views
6

Jestem całkiem nowy na Nodejs i żagle. Wdrażam serwer podobny do Twittera. W modelu użytkownika powinny znajdować się 2 pola: follower i następna, a 2 pola to powiązanie samego modelu "user".Sails.js Model: stwórz 2 asocjacje do siebie nieudane

Moje pytanie dotyczy tego, kiedy model ma tylko jedno powiązanie, naśladujące lub następujące po nim, działa. Jednakże, jeśli zarówno obserwujący, jak i następujący dołączony, wystąpiłby błąd.

Kod jest coś takiego:

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

Kod spowoduje taki błąd:

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

Jak się zapełniać swoje modele w kodzie kontrolera? Jeśli nie używasz funkcji populateAll(), podajesz nazwę atrybutu do wypełnienia()? –

+0

@AlexAlksne I zapełnić w następujący sposób: 'User.find ({alias: item.alias}) .upulate ('follower'). Exec (console.log);" Właściwie to po prostu zdefiniuję "follow", nawet nigdy go nie używaj . Następnie żagle zgłaszają błąd podczas podnoszenia. –

+0

Dziwne, wszystko wydaje się poprawne. Jestem tak zaskoczony; to niewiele, ale jeśli spojrzysz na wiersz, który powoduje błąd w pliku references.js, zawiera następujący komentarz: "Jeśli nie znaleziono pasujących atrybutów, wyślij błąd, ponieważ próbujesz dodać atrybut hasMany do modelu, do którego przypisane jest powiązanie. nie ma obcego klucza pasującego do kolekcji. " –

Odpowiedz

3

Dla takiego modelu użytkowania twoja definicja jest błędna, a mianowicie via słów kluczowych. Zgodnie z waterline associations docs słowo kluczowe odnosi się do drugiej strony skojarzenia. Tak więc, dla follower druga strona to following i na odwrót. Innymi słowy:

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

Można sprawdzić pełną przykład pracujący w: https://github.com/appscot/sails-orientdb/blob/master/test/integration-orientdb/tests/associations/manyToMany.selfReferencing.js

+0

Dzięki za twój przykład. Zdecydowanie tego potrzebuję. Ale myślę, że powinien istnieć ten sam problem w niektórych sytuacjach. Rozważmy, że są zdefiniowane dwie grupy, jedna to faceci, których nienawidzi, a druga to faceci, których kocha. Tak więc model powinien słuszne: '{ \t alias: 'string' \t nienawiść: { \t \t kolekcja: 'user', \t \t poprzez: 'alias' \t} \t love: { \t \t kolekcja: 'user', \t \t poprzez: 'alias' \t} } ' spowoduje to ten sam problem, prawda? Jak mogę tego uniknąć? –

+0

Myślę, że musisz utworzyć 2 odrębne skojarzenia samopodstawiające. Jedno skojarzenie to 'loves' /' lovedBy', a inne to 'hates' /' hatedBy'. Mam nadzieję, że pomaga! –

+0

Naprawdę pomocne. Wielkie dzięki ~~. :-) –