2010-07-20 22 views
0

Mes données ressemble à ceci:relations ActiveRecord lorsque le modèle a à la fois un et plusieurs du même modèle

class Team < ActiveRecord::Base 
    has_many :persons 
    has_one :leader 
end 

class Person < ActiveRecord::Base 
    belongs_to :team 
end 

personne appartient à une seule équipe, mais des nombreux membres de l'équipe il y a seulement 1 chef.

Première question: devrais-je utiliser belongs_to au lieu de has_one dans le modèle Team? Deuxièmement: L'équipe est créée avec beaucoup de personnes et le leader connu au départ. Comment cela devrait-il être fait?

Actuellement, je suis en train de faire quelque chose comme ça dans mon contrôleur:

@team = Team.new 

    for (each new person as p) 

    new_person = @team.persons.build 
    new_person.name = p.name 

    if p.is_marked_as_leader 
     @team.leader = new_person 
    end 
    end 

    @team.save 

Ceci est un problème, quand je liste @ team.persons, @ team.leader a le premier identifiant, je suppose que @team. enregistrer enregistre l'association leader en premier. J'ai besoin qu'ils soient dans l'ordre où ils sont fournis.

Merci!

+3

S'il vous plaît changer le titre de votre question à un plus significatif. –

+0

Mon mauvais, je l'éditais juste. Je ne voulais pas poster comme ça. – emery

+0

voter pour rouvrir avant op crée un nouveau. – OscarRyz

Répondre

0

Je voterais pour 'has_one' pour le leader, parce que vous, la personne peut exister en dehors de l'équipe et son rôle en tant que chef d'équipe. Il s'agit de la discussion aggregation vs composition. Parfois c'est ouvert au débat, mais dans ce cas je dirais que la relation d'équipe-chef est clairement la composition.

+0

Oh, en fait, la personne ne peut pas exister en dehors de l'équipe et de son rôle. Le contenu en utilisation réelle est plus un instantané d'un état de cette équipe dans le temps, donc la personne représente l'état d'une entité externe. Puis-je inverser votre réponse pour suggérer que, pour la même raison, il devrait en fait appartenir à? – emery

+0

Comme je l'ai dit: c'est la vieille discussion A vs C ;-). Permettez-moi de le dire autrement: si vous supprimez l'équipe, voulez-vous supprimer la personne qui est teamlead? C'est un test pour distinguer A de C. –

+0

Oui, je les supprimerais. Merci :) – emery