2012-06-09 4 views
0

J'ai deux modèles, utilisateur et événement. J'ai besoin de deux types de relation entre l'utilisateur et l'événement.association de rails has_many_and_belongs_to

  • utilisateur (: comme organisateur) < -------> L'événement, plusieurs à plusieurs
  • utilisateur (: comme participant) < -------> l'événement, plusieurs à plusieurs relation

Je suppose que deux associations has_many_and_belongs_to différentes avec le polymorphisme peuvent être utilisées pour implémenter les relations. Je suis nouveau sur les rails donc j'apprécierais toute aide concernant le problème.

+0

Peut-on être un utilisateur organisateur en même temps (il) est un participant? Si ce n'est pas le cas je ne pense pas que vous ayez besoin d'une association polymorphe – jagse

Répondre

2

Vous n'aurez pas besoin d'une relation polymorphe pour cela.

Pour définir deux associations entre deux modèles, vous pouvez faire quelque chose comme:

class User 
    has_many :organized_events, foreign_key: :organizer_id, class_name: "Event" 
    has_many :attended_events, foreign_key: :attendee_id, class_name: "Event" 
end 

class Event 
    belongs_to :organizer, class_name: "User" 
    belongs_to :attendee, class_name: "User" 
end 

Cela vous donnera un à plusieurs.

Si vous avez besoin de plusieurs à plusieurs, vous aurez besoin d'une table de jointure pour chaque association.

class User 
    has_many :attendances, foreign_key: :attendee_id 
    has_many :attended_events, through: :attendances 
end 

class Event 
    has_many :attendances, foreign_key: :attended_event_id 
    has_many :attendees, through: :attendances 
end 

class Attendance 
    belongs_to :attended_event, class_name: "Event" 
    belongs_to :attendee, class_name: "User"   
end 

Et quelque chose de similaire pour l'association d'organisateurs d'événements.

Voir ma question here

+0

les tableaux de jointure fonctionnaient parfaitement, merci – pratuat

+0

génial! content que ça a marché pour toi –

0

Comme je l'ai mentionné dans mon commentaire vous avez seulement besoin d'une association polymorphe si votre organisateur de relations et votre participant peuvent exister en même temps pour le même utilisateur. Si tel est le cas, utilisez une association polymorphe, sinon vous pouvez utiliser une association has_many :through ou une association has_and_belongs_to_many. Le premier est plus flexible, car vous avez un modèle supplémentaire qui peut contenir des validations par exemple.