8

Tengo modelos de vuelo, persona y planeador en una aplicación de Rails 3. Definí las relaciones personalizadas porque necesito más de una clave externa que haga referencia a una persona de la tabla de vuelos. Las asociaciones funcionan solo en UN SOLO CAMINO.Rieles asociaciones múltiples entre dos modelos

class Flight < ActiveRecord::Base 
    belongs_to :pilot, :class_name => "Person" 
    belongs_to :instructor, :class_name => "Person" 
    belongs_to :towplane_pilot, :class_name => "Person" 
    belongs_to :airplane_instructor, :class_name => "Person" 

    belongs_to :glider 
    belongs_to :rep_glider, :class_name => "Glider" 

    belongs_to :departure_airfield, :class_name => "Airfield" 
    belongs_to :arrival_airfield, :class_name => "Airfield" 

end 

class Glider < Aircraft 
    has_many :flights 
    has_many :replaced_flights, :foreign_key => "rep_glider_id", :class_name => "Flight" 
end 

class Person < ActiveRecord::Base 
    has_many :flights, :foreign_key => "pilot_id", :class_name => "Flight" 
    has_many :instructed_flights, :foreign_key => "instructor_id", :class_name => "Flight" 
    has_many :towed_flights, :foreign_key => "towplane_pilot_id", :class_name => "Flight" 
    has_many :instructed_towing_flights, :foreign_key => "airplane_instructor_id", :class_name => "Flight" 
end 


####What works##### 
Flight.first.glider 
Flight.first.rep_glider 
Flight.first.pilot 
Flight.first.instructor 
Flight.first.towplane_pilot 
Flight.first.airplane_instructor 

Glider.first.flights 
Glider.first.replaced_flights  

####What doesn't work#### ----> NoMEthodError 'match' 
Person.first.flights 
Person.first.instructed_flights 
Person.first.towed_flights. 
Person.first.instructed_towing_flights 

Estoy casi allí, pero yo no entiendo cómo funciona cuando Glider.first.flightsPerson.first.flights no.

ACTUALIZACIÓN: Asociaciones con '' el campo de aviación funciona ... así que no tengo ni idea de por qué no funciona con 'Persona'

class Airfield < ActiveRecord::Base 
    has_many :takeoff_flights, :foreign_key => "departure_airfield_id", :class_name => "Flight" 
    has_many :grounded_flights, :foreign_key => "arrival_airfield_id", :class_name => "Flight" 
end 

###Works Correctly 

Airfield.first.takeoff_flights 
Airfield.first.grounded_flights 

Flight.first.departure_airfield 
Flight.first.arrival_airfield 
+1

Hola, creé un pequeño proyecto de rieles con su clase 'Flight',' Glider' y 'Person', y para mí simplemente funciona. Creo que su modelo de datos es una solución perfecta para su área problemática. ¿Podría mostrar el error exacto? ¿De dónde viene el error nomethod? ¿Tal vez tu clase tiene un método 'after_initialize'? – nathanvda

+0

Extrañamente, lo intenté de nuevo (después de tres días de golpear mi cabeza contra la pared) y funciona ahora. Agregué un nuevo registro en la tabla de vuelos y las asociaciones funcionan correctamente, e incluso funcionan con los vuelos anteriores que había guardado. No tengo idea. Gracias por el aviso, intentaré crear una nueva aplicación de rieles cuando tenga un problema similar. ¿Cómo debería responder esta pregunta? Quizás agregue mi propia respuesta con este comentario? – bruno077

+0

Me alegra saber que también funciona para ti ahora. No estoy seguro de lo que debe hacer: ¿responderlo con ese comentario o eliminarlo? – nathanvda

Respuesta

0

Me han dicho que la asociación entre estos modelos está configurada correctamente.

He añadido un nuevo registro a la tabla de vuelos, y ahora las asociaciones funcionan correctamente con este nuevo registro y todos los anteriores. No estoy muy seguro de cómo está funcionando ahora, pero seguro que sí.

0

¿Sus pilotos tienen tipos? como una columna pilot_type? Acabo también empecé a leer en estos tipos de patrones y por suerte aún así es un poco fresco (esperemos que por favor, corríjanme si estoy wron carriles ninjas :).!)

Usted está en necesidad del patrón polimórfico como se discute aquí:

http://asciicasts.com/episodes/154-polymorphic-association

+0

Buscando la simplicidad, he decidido ir con el modelo One Class, One Table para las personas. Tengo un atributo "glider_pilot_status" con los valores "ninguno", "aprendiz" y "piloto"; entonces cuando se registran vuelos, el modelo valida que el "piloto_id" es una persona con "glider_pilot_status" = "piloto". Veré su sugerencia, pero no tengo ni idea de por qué mi opción publicada no funciona. – bruno077

+0

te ayudaría extremadamente a usar el polimorfismo ya que estás usando diferentes tipos de piloto, ¡pero mucha suerte para ti! – corroded

+0

Después de leer el artículo, creo que hay una solución mejor que el polimorfismo para el autor. Podría haber utilizado la herencia de tabla única porque los tres tipos de artículos tienen todos los atributos en común, y son mutuamente excluyentes (un artículo no puede ser una foto o un evento, pero no dos de ellos al mismo tiempo). En mi caso personal, una persona puede ser piloto o aprendiz, pero después de convertirse en piloto también puede ser un towplane_pilot y un instructor, por lo que la exclusividad mutua no es la mejor para mí, y también tienen diferentes atributos. – bruno077

Cuestiones relacionadas