2010-05-24 4 views
0

J'ai trois modèles dans une application Rails: Game représente une instance d'un jeu en cours de lecture. Player représente une instance d'un participant à un jeu. User représente une personne enregistrée qui peut participer à des jeux.Rails: bidirectionnel has_many: relation directe

Chaque Game peut avoir beaucoup Players, et chaque User peut avoir plusieurs Players (une seule personne peut participer à plusieurs jeux à la fois); mais chaque Player est dans exactement un Game, et représente précisément un User. Par conséquent, mes relations sont les suivantes à l'heure actuelle.

class Game 
    has_many :players 
end 

class User 
    has_many :players 
end 

class Player 
    belongs_to :game 
    belongs_to :user 
end 

... où naturellement la table players a game_id et user_id colonnes, mais games et users ont pas de clé étrangère.

Je voudrais également représenter le fait que chaque Game a beaucoup Users en jouant dedans; et chaque User a beaucoup Games dans lequel ils jouent. Comment puis-je faire cela? Est-il suffisant d'ajouter

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

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

Répondre

1

Ce que vous proposez devrait être suffisant; Maintenant, chaque jeu doit avoir un tableau users [], et chaque utilisateur a un tableau games [].

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

: has_many: à travers est essentiellement une extension du modèle type many-to-many où vous avez une table intermédiaire avec ids pour chacune des entités apparentées. Cependant, dans Rails, la relation: has_and_belongs_to_many ne permet pas à la table intermédiaire d'être une entité en elle-même, en ce sens qu'elle n'a pas d'autre signification que de servir de colle entre les deux modèles associés. Has_many: through permet à une entité réelle ou un modèle dans l'application (dans votre cas, les joueurs) d'agir comme "colle" entre deux autres (jeux, utilisateurs) mais aussi de manipuler des "joueurs" comme dans cette cas, il contient des informations importantes.

Espérons que cela aide.

+0

Je ne peux pas croire que je n'ai pas encore rencontré les guides! Je travaille essentiellement à partir de "agile web dev", qui mentionne le cas de l'article-> section-> paragraphe, mais ne couvre pas vraiment le cas "HABTM avec un vrai milieu". – Chowlett

Questions connexes