2009-06-28 154 views
0

我正在嘗試爲一些個人開發創建一個簡單的Web應用程序,但是我遇到了一個障礙,我希望別人會發現這個障礙。我創建了工作班,但我不確定如何定義他們的關係,或者他們的模型是否合適。Ruby on Rails中的對象和關係

爲了討論的方便,我有以下類別已經存在:用戶,團隊,運動員

我追求的功能是使用戶通過添加創建一個團隊一名運動員到球隊對象。其他用戶可以向球隊添加球員,也可以在球隊名單上爲現有運動員添加替代方案。基本上,我想創建一些類來包裝一系列運動員對象,我們將其稱爲AthleteArray

如果我的理解是正確的,這是將是適當的關係:

  1. 所以一個團隊有一對多AthleteArrays
  2. AthleteArray享有以下權利─很多運動員屬於 a 團隊
  3. 運動員屬於對一個用戶,並會屬於對一個AthleteArray
  4. 用戶有很多運動員,但這將是他們參與的程度。

由於AthleteArray類將沒有任何屬性,是明智將其創建爲一個ActiveRecord對象(將它僅僅有一個ID)?有沒有另一種方法來實現這個想法(你可以定義團隊類,有一個運動員對象數組數組)?我對RoR知之甚少,但我認爲這將是一個開始web開發的好地方。任何幫助,將不勝感激。提前致謝!

編輯:運動員,隊伍和運動員陣容的名字並不重要。假設運動員基本上是一個評論,對運動員列表進行了驗證。複製是可以接受的。如果我理解所發佈的答案,我基本上應該創建一箇中間班級,並且需要他們父母的ID。

對Omar的迴應: 最後,我想添加投票系統。因此,在創建基本團隊之後,用戶可以單獨建議替換給定的播放器,用戶可以投票選出最佳選擇。舉例來說,如果我有創造了球隊chess_players的:

  1. 菲捨爾
  2. 卡斯帕羅夫
  3. 弗拉基米爾·克拉姆尼克

有人會點擊卡斯帕羅夫,並決定一個更好的運動員會深藍,所以這個選項會出現在Kasparov下,直到收到更多的選票。對於每個角色都會發生同樣的過程,但與評論系統不同,您無法響應「深藍」並替換其他玩家,您只需對位置編號2作出迴應,並建議其他玩家。

回答

1

權在數據庫中表示這個,所以如果我正確地理解這個問題,會有運動員團隊的許多可能的組合,這可能會或可能不會使用相同的運動員?

這裏聽起來有點可能在你的模型的命名。不太喜歡AthleteArrays的氣味。

has_many_through可能是您需要從您的團隊訪問運動員的內容,例如

has_many :athletes, :through => :team_permuations # your AthleteArray model 

喬什Susser有很多的,而我的猜測是你所需要的,因爲根據您的規格,理論上它可以是可能的運動員屬於任意數量的團隊很多協會的老綜述。我想最好的事情是,你可以在你的多對多關聯中擁有自動填充的審計列(created/updated_at/on),這是一件好事。

http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off

,如果你認爲我已經明白這個問題錯了,請發表評論。

+0

我編輯了我的問題。希望現在有點可以理解。感謝您的迴應! – Grantismo 2009-06-28 19:57:57

1

如果我明白你的需要,這是可以通過has_many:through解決的。

基本上可以像

athletes: 
    id 
    other_fields 

teams: 
    id 
    other_fields 

roster_items: 
    id 
    team_id 
    athlete_id 
    position 
    is_active #is currently on the team or just a suggestion 
    adding_user_id #the user who added this roster item 

class Athlete < ActiveRecord::Base 
    has_many :roster_items 
end 

class Team < ActiveRecord::Base 
    has_many :roster_items 
    has_many :athletes, :through => :roster_items 
end 

class RosterItem < ActiveRecord::Base 
    belongs_to :team 
    belongs_to :athlete 
    belongs_to :adding_user, :class_name => 'User' 
end