8

레일즈 3 앱에서 Flight, Person 및 Glider 모델을 보유하고 있습니다. flight 테이블의 Person을 참조하는 둘 이상의 외래 키가 필요하기 때문에 사용자 정의 관계를 정의했습니다. 협회는 일하지만 오직 한 가지. 두 모델 간의 다중 연결을 레일 링합니다.



####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 

내가 거의 다 해요,하지만 Person.first.flights하지 않는 경우 내가 Glider.first.flights이 작업을 수행하는 방법을 이해하지 않습니다

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 
.

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' 클래스로 작은 레일 프로젝트를 만들었고 제게 그것은 작동합니다. 데이터 모델이 문제 영역에 대한 완벽한 솔루션이라고 생각합니다. 정확한 오류를 표시 할 수 있습니까? 어디에서 노름 오류가 발생 했습니까? 어쩌면 당신의 클래스는'after_initialize' 메소드를 가지고 있을까요? – nathanvda

+0

이상하게도, 나는 (벽에 머리를 두드리는 삼일 후에) 다시 시도해 보았다. 나는 비행기 표에 새로운 기록을 추가했고 협회는 올바르게 작동하며, 내가 구해 놓았던 이전 비행편과도 작업합니다. 나는 우둔 해. 머리를 가져 주셔서 감사합니다. 비슷한 문제가있을 때 새로운 레일 어플리케이션을 만들려고 노력할 것입니다. 이 질문에 어떻게 대답해야합니까? 아마도이 설명과 함께 내 자신의 대답을 추가 할 수 있습니까? – bruno077

+0

듣기 좋게 듣고 나도 당신을 위해 일합니다. 어떤 조치를 취해야할지 잘 모르겠다 : 그 의견으로 대답하거나 삭제 하시겠습니까? – nathanvda

답변

0

이러한 모델 간의 연관성이 올바르게 설정되었다고 들었습니다.

flight 테이블에 새 레코드를 추가했는데 이제는이 새 레코드와 이전 레코드가 모두 올바르게 작동합니다. 나는 그것이 지금 어떻게 작동 하는지를 정말로 모르고있다. 그러나 그것은 확실히한다.

0

이 조종사 유형이 있습니까 작동하지 않는 이유에 우둔 해요 ... 작동? pilot_type 열을 좋아합니까? 난 그냥 또한 패턴의 이러한 종류로 읽기 시작하고 운이 좋게이 (임 wron 닌자 레일 경우 잘하면 저를 수정하시기 바랍니다 :.!) 여기에서 논의 된 바와 같이

당신은 다형성 패턴을 필요로하는 여전히 조금 신선 :

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

+0

단순함을 찾으면서 나는 사람들을위한 One Class One Table 모델을 사용하기로 결정했습니다. 나는 "none", "trainee"및 "pilot"값을 가진 "glider_pilot_status"속성을 가지고 있습니다. 비행을 기록 할 때 모델은 "pilot_id"가 "glider_pilot_status"= "pilot"인 사람인지 확인합니다. 나는 당신의 제안을 들여다 보겠다.하지만 내 게시 된 옵션이 효과가없는 이유에 관해선 우둔하다. – bruno077

+0

다른 파일럿 유형을 사용하기 때문에 다형성을 사용하는 것이 매우 도움이되지만, 행운을 빈다. – corroded

+0

기사를 읽은 후에 저자에 대한 다형성보다는 더 나은 해결책이 있다고 생각합니다. 그는 세 가지 유형의 아티클이 모든 속성을 공통으로 갖고 있기 때문에 단일 테이블 상속을 사용할 수 있었을뿐 아니라 상호 배타적입니다 (기사는 사진이나 이벤트는 아니지만 동시에 두 개가 아님). 내 개인적인 경우에 한 명은 조종사 또는 연수생이 될 수 있지만 조종사가 된 후 그는 또한 towplane_pilot 및 강사가 될 수 있으므로 상호 배타성은 내게 적합하지 않으며 서로 다른 속성을 가지고 있습니다. – bruno077

관련 문제