2010-09-15 16 views
1

Je suis sûr que cela a déjà été demandé un million de fois. Je ne cherche pas très bien. J'ai la configuration suivante: J'ai un instructeur qui a beaucoup d'événements. Chaque événement n'a qu'un seul instructeur (propriétaire/créateur). Je souhaite ajouter un lien séparé pour permettre à d'autres instructeurs d'être associés tout en conservant l'instructeur d'origine (propriétaire). J'ai une représentation ASCII brute mais je ne peux pas pour la vie de moi comprendre comment faire cela dans un modèle de rails.Lier deux tables ensemble en utilisant has_many AND has_one?

   ,-------------------. 
       | other_instructors | 
       |-------------------| 
       | event_id   |-------------. 
,---------------| instructor_id  |    | 
|    `-------------------'    | 
| ,---------------------.      | 
`->>| instructor   |<--.     | 
    |---------------------| | ,------------. | 
    | name    | | | event  |<-' 
    | email    | | |------------| 
    | office    | | | title  | 
    | phone    | | | location | 
    | admin?    | | | benefit | 
    | notify_recipient? | | | notes  | 
    | new_user?   | | | start_time | 
    | (acts_as_authentic) | | | end_time | 
    `---------------------' | | live_in? | 
           `---| instructor | 
            `------------' 
@instructor.events = [... array of events ...] 
@associated_events = [... array of events associated but not owned via other_instructors table ...] 
@event.instructor = ... One Instructor ... 
@event.other_instructors = [... array of other instructors ...] 

Répondre

1

2 points pour l'ASCII. Je ne sais rien à propos de Rails, mais serait-il plus logique de retirer la référence étrangère de l'instructeur de la table event et d'ajouter un champ bit is_primary_instructor à la table des événements associée?

+0

Soupir. Tu as raison. J'espérais éviter de restructurer ma base de données comme ça. Il est préférable de le faire maintenant avant qu'il ne soit mis en production. – Sukima

1

D'accord avec Shlomo. Donc, chaque instructeur a de nombreux événements, et chaque événement a de nombreux instructeurs. Mais vous devez identifier un instructeur comme instructeur principal.

===== ===== MISE À JOUR

Pour référencer l'instructeur principal:

class InstructEvent 
    # add this: 
    named_scope :primary, :conditions => { :is_primary_instructor => true } 
end 

donné un événement, trouver l'instructeur principal de l'événement:

event.instruct_events.primary.instructor 

étant donné un instructeur, trouver l'événement que l'instructeur est primaire:

instructor.instruct_events.primary.event 

Peut-être pourriez-vous donner un meilleur nom à la classe InstructEvents.

Et aussi j'espère voir des solutions plus belles aussi: D

+0

Comment référencez-vous l'primary_instructor alors? – Sukima

+0

J'ai mis à jour la réponse pour montrer le chemin pour trouver l'instructeur principal. J'espère que ça vous va. – PeterWong