rotaie da molti a molti si uniscono

qualcuno potrebbe indicarmi la giusta direzione:

Provo a build un modello per rotaie che sviluppi quanto segue:

ClassA -id

ClassA ha una relazione con molti “ClassA” (quindi è un riferimento a se stesso)

Sto cercando la migrazione e il modello.

Non sono sicuro di quale sia la tabella di join corretta (penso che sia una semplice tabella di 2 colonne ClassA_id, ClassARel_ID -> puntano entrambi a ClassA) e come build il modello

Grazie!

Userei qualcosa di simile

class Person < ActiveRecord::Base has_many :friendships, :foreign_key => "person_id", :class_name => "Friendship" has_many :friends, :through => :friendships end class Friendship < ActiveRecord::Base belongs_to :person, :foreign_key => "person_id", :class_name => "Person" belongs_to :friend, :foreign_key => "friend_id", :class_name => "Person" end 

E i tavoli sarebbero come

 people: id; name; whatever-you-need friendships: id; person_id; friend_id 

Se non ha troppo senso creare un’altra class per unire i due, un approccio alternativo potrebbe essere:

 class Word < ActiveRecord::Base has_and_belongs_to_many :synonyms, class_name: "Word", join_table: "word_synonyms", association_foreign_key: "synonym_id" end 

La tabella di join sarebbe simile a questa:

 create_table :word_synonyms do |t| t.integer :word_id t.integer :synonym_id end 

Questo post ha un buon esempio di lavoro: http://blog.hasmanythrough.com/2007/10/30/self-referential-has-many-through

C’è anche una domanda correlata: Problema con autoreferenziale has_many: attraverso le associazioni in Rails

Sfortunatamente la risposta di Whistler potrebbe non essere adatta in molti casi. Ad esempio, non funziona in entrambi i modi. Ad esempio, supponi di creare una nuova parola:

 word = Word.create(:word_name => 'tremble') ['shake', 'vibrate'].each { |syn| word.synonyms.create(:word_name => syn) } 

Ora, se lo fai:

 word = Word.find_by_word_name('tremble') p word.synonyms # this would print out the Words with the word_name 'shake' and 'vibrate'. 

tuttavia, se l’hai fatto al contrario:

 word = Word.find_by_word_name('vibrate') p word.synonyms # this would print an empty association. 

Questo sta dicendo che la parola “vibrare” non ha sinonimi.

Quindi, in pratica, questo metodo non funzionerà in entrambi i modi (ad es. Vibrare è sinonimo di tremore e tremito è sinonimo di vibrazione)

Modifica: In un certo senso, potresti utilizzare questo approccio, tuttavia, dovresti assegnare esplicitamente i sinonimi per ogni parola. Quindi, anche se hai specificato i sinonimi di tremare (che sono ‘vibrazione’ e ‘tremare’), dovresti comunque specificare i sinonimi di ‘shake’ (‘che sono’ tremare ‘e’ vibrare ‘) e’ vibrare ‘(che sono’ tremare ‘e scuotere’) pure.