2011-09-05 50 views
1

我正在構建一個足球遊戲,並且在創建俱樂部和匹配課程時遇到麻煩。我希望能夠做到這一點:與同一班級的多個has_many關係

match = Match.find(2) 
match.home_club = <some club here> 
match.away_club = <other club here> 

而且也是這樣:

club = Club.find(2) 
club.matches # Returns all matches where club plays home or away 

這是我現在有:

class Club < ActiveRecord::Base 
    has_many :matches 
end 

class Match < ActiveRecord::Base 
    belongs_to :home_club, :class_name => "Club" 
    belongs_to :away_club, :class_name => "Club" 
end 

但是,當我嘗試做Club.first.matches,我得到這個錯誤:

​​

I ha我玩過:inverse_of,但我沒有得到它的工作。這是甚至可能是這樣嗎?還是我需要在Club中有兩個單獨的:has_many關係?像這樣:

class Club < ActiveRecord::Base 
    has_many :home_matches, :class_name => "Match" 
    has_many :away_matches, :class_name => "Match" 
end 

我也試過,但它也沒有工作。

+0

你有沒有解決這個問題?謝謝。 – Chance

+0

你解決了嗎? – RyanJM

回答

0

你需要建立一個多一對多的關係,所以你需要一個鏈接表。而不是在任何一個實體表中都有外鍵,這個表存儲這些關係,並且除了match_id和club_id之外什麼也沒有關聯這兩個表。然後,您可以使用

class Club < ActiveRecord::Base 
    has_many :matches, :through => :matches_clubs 
end 

詳見這裏 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+0

這將允許我做'match.clubs',但不能'match.home_club'和'match.away_club' .. – Rits

+0

這個關係不是真正的n-m嗎?它顯然是2-n,我想這不是一個正常的關係來定義,但只有關係的表是有點多? –

+0

這是一個非常標準的模式。然後,您還可以在鏈接表中爲匹配添加各種信息。主頁或離開。他們那天穿什麼顏色。 – Joshua

0

你定義爲home_club_idaway_club_id架構中的關係?因爲它似乎軌正在試圖獲得match.club_id這顯然與您需要

我覺得你的模式是錯誤的,應予修改模型衝突。 俱樂部不應該有match_id

比賽應該是:

  • home_club_id
  • away_club_id
  • 時間
  • 得分

俱樂部應該是:

  • 城市

我想,如果刪除了屬於從俱樂部你應該罰款。

如果你想能夠做到club.matches。 您可能必須編寫一個自定義sql查詢,該查詢既可以在home_club列中查看,也可以在away_club列中查看。或者爲俱樂部製作一個關係表 - >如果俱樂部在家或者離開,那麼就有一個額外的metafield說。雖然你在你的比賽表中有主客場俱樂部

+0

是的,他們被定義爲'home_club_id'和'away_club_id'。當我訪問'home_club'時,如何告訴Rails尋找'home_club_id'? – Rits

+0

has_one:away_club,:class_name =>「Club」,:foreign_key =>:away_club_id – Joshua

+0

已更新我的答案 –