Rails:双向has_many:通过关系

时间:2010-05-24 14:40:02

标签: ruby-on-rails has-many-through

我在Rails应用程序中有三个模型:Game表示正在播放的游戏的实例。 Player表示游戏参与者的实例。 User代表可以参加游戏的注册人。

每个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 个答案:

答案 0 :(得分:1)

你的建议应该足够了;现在,每个游戏都应该有一个users []数组,每个用户都有一个games []数组。

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

:has_many:through基本上是典型的多对多模型的扩展,其中您有一个中间表,其中包含每个相关实体的ID。但是,在Rails中,:has_and_belongs_to_many关系不允许中间表本身就是一个实体,因为它除了作为两个相关模型之间的粘合剂之外没有任何意义。

:has_many:通过允许应用程序中的真实实体或模型(在您的情况下,玩家)充当两个其他人(游戏,用户)之间的“粘合剂”,但也允许您操纵“玩家”,就像在这种情况下一样它确实包含重要信息。

希望这有帮助。