8

J'ai des modèles Flight, Person et Glider dans une application Rails 3. J'ai défini des relations personnalisées car j'ai besoin de plus d'une clé étrangère référençant une personne à partir de la table des vols. Les associations fonctionnent mais UNIQUEMENT.Rails multiples associations entre deux modèles

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 

Je suis presque là, mais je ne comprends pas comment fonctionne le Glider.first.flights quand Person.first.flights ne fonctionne pas.

MISE À JOUR: Les associations avec « l'aérodrome » fonctionne ... donc je suis désemparés quant à pourquoi il ne fonctionne pas avec « personne »

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

Salut, j'ai créé un petit projet de rails avec vos classes 'Flight',' Glider' et 'Person', et pour moi ça marche. Je pense que votre modèle de données est une solution parfaite pour votre problème. Pourriez-vous montrer l'erreur exacte? D'où vient l'erreur de nom de code? Peut-être que votre classe a une méthode 'after_initialize'? – nathanvda

+0

Etrangement, j'ai juste essayé à nouveau (après trois jours de me cogner la tête contre le mur) et ça marche maintenant. J'ai ajouté un nouveau record dans la table des vols et les associations fonctionnent correctement, et ils fonctionnent même avec les vols précédents que j'avais enregistrés. Je suis désemparé. Merci pour les heads up, je vais essayer de créer une nouvelle application rails quand j'ai un problème similaire. Comment devrais-je répondre à cette question? Peut-être ajouter ma propre réponse avec ce commentaire? – bruno077

+0

Ravi de l'entendre travailler pour vous maintenant. Vous ne savez pas ce que vous devriez faire: répondez-y avec ce commentaire ou supprimez-le? – nathanvda

Répondre

0

On m'a dit que l'association entre ces modèles est définie correctement.

J'ai ajouté un nouvel enregistrement à la table des vols, et maintenant les associations fonctionnent correctement avec ce nouvel enregistrement et tous les précédents. Je ne suis pas vraiment sûr de comment ça marche maintenant, mais c'est sûr.

0

Faites vos pilotes ont des types? comme une colonne pilot_type? Je viens aussi commencé à lire dans ce genre de modèles et, heureusement, il est encore un peu frais (espérons-le s'il vous plaît me corriger si Im wron rails ninjas :).!)

Vous avez besoin du motif polymorphes comme indiqué ici:

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

+0

À la recherche de simplicité, j'ai décidé d'aller avec le modèle One Class, One Table pour les gens. J'ai un attribut "glider_pilot_status" avec les valeurs "none", "stagiaire" et "pilot"; Ainsi lors de la journalisation des vols, le modèle valide que le "pilot_id" est une personne avec "glider_pilot_status" = "pilote". Je vais examiner votre suggestion, mais je n'ai aucune idée de la raison pour laquelle mon option affichée ne fonctionne pas. – bruno077

+0

cela vous aiderait énormément à utiliser le polymorphisme puisque vous utilisez différents types de pilotes, mais bonne chance! – corroded

+0

Après avoir lu l'article, je pense qu'il y a une meilleure solution plutôt que le polymorphisme pour l'auteur. Il aurait pu simplement utiliser l'héritage de table unique parce que les trois types d'articles ont tous des attributs en commun et sont mutuellement exclusifs (un article ne peut pas être une photo ou un événement mais pas deux de ceux-ci en même temps). Dans mon cas personnel, une personne peut être Pilote ou Stagiaire, mais après avoir été pilote, il peut aussi être un towplane_pilot et un instructeur, donc l'exclusivité mutuelle ne me convient pas et ils ont aussi des attributs différents. – bruno077

Questions connexes