2010-01-29 6 views
0

J'ai deux tables, utilisateurs et groupes. Un utilisateur peut appartenir à plusieurs groupes. Un groupe peut avoir plusieurs utilisateurs.Can Rails Active Record comprend deux relations simultanées entre deux tables à la fois?

J'ai donc créé un have_and_belongs_to_many relation entre les utilisateurs et les groupes à l'aide d'une table de jointure, groups_users. Tout cela fonctionne comme prévu.

Ce que je voudrais également faire est de spécifier un groupe ACTIVE pour chaque utilisateur. Si ce n'était la relation HABTM je l'ai déjà défini, je créerais une colonne « group_id » utilisateurs pour le groupe actif, puis je définirais un à plusieurs entre les modèles suivants:

class User < ActiveRecord::Base 
    belongs_to :group 
end 

class Group < ActiveRecord::Base 
    has_many :users 
end 

Cela n'a pas fonctionné. Je n'ai pas pu accéder aux propriétés de groupe telles que "@ user.group.name". Je soupçonne que je demande trop de Rails en spécifiant deux relations.

J'ai donc trois questions.

  1. Je pourrais très facilement comprendre si la combinaison des deux relations confond Active Record. Est-ce le cas?
  2. Si oui, comment implémenteriez-vous ces relations? En ce moment, je n'utilise que le group_id manuellement, mais cela me semble désordonné.
  3. Que j'utilise la magie Active Record ou que vous définissiez manuellement le groupe actif, il est possible que le groupe actif d'un utilisateur soit en dehors du groupe auquel il appartient en utilisant la première relation habtm. Des réflexions sur comment implémenter ceci avec la contrainte que le groupe actif doit être un groupe auquel appartient l'utilisateur?

Merci pour toute idée. Je suis dans la courbe d'apprentissage de Rails depuis quelques semaines et je pense que le fait d'aller au fond de ce petit problème approfondira ma compréhension des modèles et des relations de table.

Répondre

1

Greg - Je l'ai fait avant, similaire à ce que vous proposez. J'ai utilisé un « primary_group » au lieu de « groupe » et définir le foreign_key être « primary_group_id » et: class_name => « Groupe »

Je ne me has_and_belongs_to_many très souvent si je ne sais pas si cela causer un problème, mais je ne le pense pas - du moins pas avec le modèle de l'utilisateur. Vous n'avez pas de méthode #group, donc la configuration de belongs_to devrait être OK. Je ne sais pas si vous devez absolument avoir une méthode has_many: users sur le groupe, mais vous n'en aurez peut-être pas besoin de toute façon. Cela causera certainement une collision avec la méthode 'users' créée par habtm. Si vous en avez besoin, essayez has_many: primary_users et définissez le: foreign_key =>: primary_group_id

Juste quelques réflexions. Vous devriez être capable de faire ce que vous faites maintenant, donc pas sûr de ce qui échoue.

+0

Remerciements. Les choses fonctionnent maintenant, donc je pense que j'ai eu un autre bug quelque part. J'ai pris votre approche de renommer l'association (primary_group) pour rendre les choses plus claires. – Greg

Questions connexes