2010-08-03 24 views
13

me podría apuntar en la dirección correcta a alguien:carriles de muchos a muchos auto unen

trato de construir un modelo para los carriles que se acumulan los siguientes:

claseA -id

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

Estoy buscando la migración y el modelo.

que una no está seguro de lo que la correcta tabla de unión es (creo que es una sencilla tabla de 2 columnas ClassA_id, ClassARel_ID -> ambos apuntan a claseA) y cómo construir el modelo

Gracias!

+1

¿Puede darnos un ejemplo concreto? ¿Es esto como un humano que tiene un padre (que obviamente también es humano)? ¿O quieres decir "Car.all.green" para devolver todos los autos ecológicos? –

+1

Sí, es como la persona tiene muchos amigos (personas) – awex

Respuesta

29

que haría uso de algo así 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ía como

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

gracias, solo una pregunta para entender el fondo: cómo sabe rails que pertenece_a: amigo,: foreign_key => "friend_id",: class_name => "Person" se define en la tabla de amistades (el campo friend_id)? – awex

+0

No estoy seguro de entender su pregunta. Como podemos leer en railsapi.com, "la asignación que vincula una determinada clase de Active Record a una determinada tabla de base de datos se producirá automáticamente en la mayoría de los casos comunes". Y este es el caso aquí, debido a los nombres de clase y tabla. –

+3

No sé por qué esto no fue aceptado. Es una muy buena respuesta. Necesito probar esto y veré si se comporta como se esperaba. – Amala

13

Si no tiene mucho sentido crear otra clase para unirse a los 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 
0

de desgracia marmota la respuesta puede 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 hace:

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 hizo a la inversa:

word = Word.find_by_word_name('vibrate') 

p word.synonyms # this would print an empty association. 

Este está diciendo que la palabra 'vibrar' no tiene sinónimos.

Así que, básicamente, este método no funcionará en ambas direcciones (es decir, vibran es sinónimo de temblar, temblar y es sinónimo de vibración)

Editar: En un sentido, se podría utilizar 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.