2010-05-24 94 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