8

我有一个Rails 3应用程序中的Flight,Person和Glider模型。我定义了自定义关系,因为我需要从航班表引用一个以上的外键。协会工作,但只有一种方式。两个模型之间的轨道多个关联

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 

我几乎没有,但我不明白Glider.first.flights如何做工作的时候Person.first.flights没有。

UPDATE:协会以“飞机场”的作品...所以我无能,为什么它不与“人”

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

嗨,我用你的'Flight','Glider'和'Person'类创建了一个小型的rails项目,对我来说它只是起作用。 我认为你的数据模型是你问题领域的完美解决方案。 你能显示确切的错误吗? nomethod错误来自哪里?也许你的班级有'after_initialize'方法? – nathanvda 2011-04-10 10:47:53

+0

奇怪的是,我只是再次尝试(三天后,我的头靠在墙上),它现在起作用。我在航班表中添加了新记录,并且协会正常工作,他们甚至可以使用我以前保存的航班。我无能为力。感谢您的支持,当我遇到类似问题时,我会尝试创建一个新的Rails应用程序。我应该如何回答这个问题?也许用这个评论添加我自己的答案? – bruno077 2011-04-10 14:52:11

+0

很高兴听到它现在也适用于你。不知道你应该做什么:用该评论回答或删除它? – nathanvda 2011-04-10 16:03:10

回答

0

我被告知这些模型之间的关联设置正确。

我向航班表添加了新记录,现在这些关联可以正确地处理这条新记录和所有以前的记录。我不确定它现在是如何工作的,但它确实如此。

0

做你的飞行员有类型的工作?像pilot_type列?我也开始阅读到这些种图案,幸运的是它仍然是一个有点新鲜的(希望如有林wron轨忍者指正:)!)

您需要采用多态模式为这里讨论:

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

+0

寻找简单性,我决定为人们使用One Class,One Table模型。我有一个属性“glider_pilot_status”,其值为“无”,“实习生”和“飞行员”;所以当记录航班时,模型验证“pilot_id”是“glider_pilot_status”=“pilot”的人。我会研究你的建议,但我无能为力,为什么我的发布选项不起作用。 – bruno077 2011-04-05 16:07:27

+0

由于您使用的是不同的飞行员类型,因此它将极大地帮助您使用多态性,但祝您好运! – corroded 2011-04-05 16:14:54

+0

阅读文章后,我认为作者有更好的解决方案,而不是多态。他可以只使用单表继承,因为这三种类型的文章具有所有共同的属性,并且它们是互斥的(一篇文章不能是照片或事件,但不能同时包含两个)。 在我个人的情况下,一个人可以成为一名飞行员或一名实习生,但成为飞行员后,他也可以成为一个towplane_pilot和一名教练,所以相互排斥并不适合我,他们也有不同的属性。 – bruno077 2011-04-05 17:53:59

相关问题