2010-05-24 138 views
0

我在Rails應用程序中有三個模型:Game表示正在玩的遊戲的一個實例。 Player代表遊戲中的參與者的實例。 User代表可以參與遊戲的註冊人員。Rails:雙向has_many:通過關係

每個Game可以有很多Players,每個User可以有很多Players(一個人可以同時參加多個比賽);但每個Player恰恰在一個Game中,並且恰好代表一個User。因此,我目前的關係如下。

class Game 
    has_many :players 
end 

class User 
    has_many :players 
end 

class Player 
    belongs_to :game 
    belongs_to :user 
end 

...其中自然players表有game_iduser_id列,但gamesusers沒有外鍵。

我也想表示一個事實,那就是每個Game都有很多Users玩在裏面;並且每個User有很多Games他們正在玩。我該怎麼做呢?是否足夠添加

class Game 
    has_many :users, :through => :players 
end 

class User 
    has_many :games, :through => :players 
end 

回答

1

你建議的應該足夠了;現在,每個遊戲都應該有一個users []數組,每個用戶都有一個games []數組。

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

:的has_many:通過基本上是,你必須與IDS的相關實體的每一箇中間表中的許多典型的一對多的模型的擴展。但是,在Rails中,has_and_belongs_to_many關係不允許中間表本身是一個實體,因爲除了作爲兩個相關模型之間的粘合之外,它沒有任何意義。通過允許應用程序中的真實實體或模型(在你的情況下,玩家)充當兩個人(遊戲,用戶)之間的「粘合劑」,但也允許你操縱「玩家」它確實包含重要信息。

希望這會有所幫助。

+0

不敢相信我之前沒有遇到過指南!我基本上從「敏捷網頁開發人員」開始工作,其中提到了文章 - >部分 - >段落案例,但並沒有真正涵蓋「真正中間人」的HABTM案例。 – Chowlett 2010-05-24 15:03:23