我在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_id
和user_id
列,但games
和users
没有外键。
我还想表示每个Game
都有很多Users
在其中播放的事实;并且每个User
都有许多Games
正在播放。我该怎么做呢?是否足以添加
class Game
has_many :users, :through => :players
end
class User
has_many :games, :through => :players
end
答案 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:通过允许应用程序中的真实实体或模型(在您的情况下,玩家)充当两个其他人(游戏,用户)之间的“粘合剂”,但也允许您操纵“玩家”,就像在这种情况下一样它确实包含重要信息。
希望这有帮助。