Rails multiple associations between two models

◇◆丶佛笑我妖孽 提交于 2019-11-30 03:48:41

问题


I have Flight, Person, and Glider models in a Rails 3 app. I've defined custom relationships because I need more than one foreign key referencing a Person from the flights table. Associations work but ONE-WAY only.

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

I'm almost there, but I don't understand how Glider.first.flights does work when Person.first.flights doesn't.

UPDATE: Associations with 'Airfield' works... so I'm clueless as to why it doesn't work with 'Person'

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:


Do your pilots have types? like a pilot_type column? I just also started reading into these kinds of patterns and luckily it's still a bit fresh(hopefully. please correct me if Im wron rails ninjas! :))

You are in need of the polymorphic pattern as discussed here:

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




回答2:


I've been told that the association between these models is set correctly.

I added a new record to the flights table, and now the associations work correctly with this new record and all the previous ones. I'm not really sure how it is working now, but it sure does.



来源:https://stackoverflow.com/questions/5554590/rails-multiple-associations-between-two-models

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!