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

相關問題