2011-10-10 68 views
0

我試圖確定一個特定組織有多少會議時間,但這並不像看起來那麼容易,因爲某些關係很複雜。Rails:與3個鍵的複雜HABTM關係?

class Meeting < ActiveRecord::Base 
    has_and_belongs_to_many :people 
end 

class Person < ActiveRecord::Base 
    has_any_belongs_to_many :meetings 
    has_and_belongs_to_many :positions 
end 

class Position < ActiveRecord::Base 
    has_and_belongs_to_many :people # b/c over time more than one person 
         may hold this position over time 
    belongs_to :organization 
end 

class Organization < ActiveRecord::Base 
    has_many :positions 
end 

,因爲人們可能會隨着時間改變位置(和組織),當有人到會,我也需要記在那個時候他們的立場,以便理貨是準確的。因爲HATBM連接表隱式處理(meetings_people),所以我無法跟蹤位置。我如何在這種組合中添加位置,以及編寫查詢以獲得每個組織的總會議時間的最佳方式是什麼?

在此先感謝您提供的任何幫助或建議!

回答

1

has_many :through允許您使用正確的連接模型,而不是像habtm這樣的暗示。你可以創建一個類似MeetingAttendance的課程,在那裏你可以存儲會議和參加者。然後你可以在你想要的模型上放置任何屬性,包括position。然後,只需

Person has_many :meeting_attendances 
Person has_many :meetings, :through => :meeting_attendances 
Meeting has_many :meeting_attendances 
Meeting has_many :people, :through => :meeting_attendances 

class MeetingAttendance < ActiveRecord::Base 
    belongs_to :person 
    belongs_to :meeting 
end 

注意:您可能需要調整,由於我不知道的Rails如何處理「人」的多元化,但這是一般的想法。

Documentation here