Rails muchos a muchos se unen

podría alguien señalarme la dirección correcta:

Intento crear un modelo de Rails que genere lo siguiente:

ClassA -id

ClassA tiene una relación con muchos “ClassA” (por lo que es una referencia a sí mismo)

Estoy buscando la migración y el modelo.

No estoy seguro de cuál es la tabla de combinación correcta (creo que es una tabla simple de 2 columnas ClassA_id, ClassARel_ID -> ambos apuntan a ClassA) y cómo construir el modelo

¡Gracias!

Yo usaría algo como

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 

Y las tablas serían como

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

Si no tiene demasiado sentido crear otra clase para unir las dos, un enfoque alternativo podría ser:

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

La tabla de unión se vería así:

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

Esta publicación tiene un buen ejemplo de trabajo: http://blog.hasmanythrough.com/2007/10/30/self-referential-has- many – through

Aquí también hay una pregunta relacionada: Problema con self-referential has_many: a través de asociaciones en Rails

Lamentablemente, la respuesta de Whistler podría no ser adecuada en muchos casos. Por ejemplo, no funciona en ambos sentidos. Por ejemplo, supongamos que crea una nueva palabra:

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

Ahora, si lo haces:

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

sin embargo, si lo hiciste al revés:

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

Esto está diciendo que la palabra ‘vibrar’ no tiene sinónimos.

Así que, básicamente, este método no funcionará en ambos sentidos (es decir, vibrar es sinónimo de temblor y temblar es sinónimo de vibrar)

Editar: en cierto sentido, podría usar este enfoque, sin embargo, tendría que asignar explícitamente los sinónimos para cada palabra. Entonces, aunque haya especificado sinónimos de temblar (que son ‘vibrar’ y ‘sacudir’), aún debe especificar los sinónimos de ‘sacudir’ (‘que son’ temblar ‘y’ vibrar ‘) y’ vibrar ‘(que son’ tiembla “y tiembla”) también.