2010-07-28 4 views
1

Dans l'application que je construis, je veux avoir des événements. Les personnes peuvent alors s'inscrire à l'événement en créant une équipe, en s'inscrivant directement à un événement (pas d'équipe) ou en rejoignant une équipe existante. Au départ, je l'avais créé car l'Event a beaucoup d'équipes, l'équipe a beaucoup d'utilisateurs, l'utilisateur appartient à Team et Event. Cependant, je prévois des problèmes si un utilisateur enregistré veut rejoindre un autre événement (ou équipe pour un autre événement), et aussi en essayant de lister des choses comme @ user.events ou @ user.teams dans le panneau de contrôle. Quelqu'un a suggéré d'utiliser une table de jointure et de créer un modèle d'enregistrement/une migration pour les joindre. Puis-je avoir un modèle de jointure appartenant à un événement, une équipe et un utilisateur? Est-ce que je m'approche de tout cela?Rails joindre des tables ou des associations HABTM

Répondre

2

Vous pouvez créer un enregistrement de modèle de jointure et rendre le polymorphe belongs_to afin qu'il puisse faire référence à n'importe quel type d'objet. Voici un exemple:

modèles/team.rb:

class Team < ActiveRecord::Base 
    has_many :registrations, :as => :owner 
end 

modèles/user.rb

class User < ActiveRecord::Base 
    has_many :registrations, :as => :owner 
end 

modèles/registration.rb

class Registration < ActiveRecord::Base 
    belongs_to :owner, :polymorphic => true 
end 

modèles/event.rb

class Event < ActiveRecord::Base 
    has_many :registrations 
end 

db/migrations/1234_add_registrations.rb

... 
t.belongs_to :owner, :polymorphic => true 
t.belongs_to :event 
... 

Maintenant, vous pouvez regarder regard sur les inscriptions pour voir qui a signé pour votre événement. Vous pouvez utiliser has_many: events,: through =>: inscriptions,: source =>: owner pour revenir aux utilisateurs, mais notez qu'il existe certaines limitations, comme has_many: owners,: through =>: registrations, qui sont abordées dans des plugins comme has_many_polymorphs.

Questions connexes