2011-06-08 4 views
0

Considérez ces deux ressources: utilisateur et groupe.Modélisation et routage des relations

Règles:

  • Un groupe est détenu par un utilisateur;
  • Un groupe contient de nombreux utilisateurs;
  • Un utilisateur peut avoir plusieurs groupes;
  • Un utilisateur peut s'occuper de plusieurs groupes;

Ce que j'ai:

class User 
    has_many :groups, :foreign_key => "owner_id" 
    has_and_belongs_to_many :attended_groups, 
         :class_name => "Group", 
         :join_table => "groups_members", 
         :foreign_key => "member_id" 
end 

class Group 
    belongs_to :owner, :class_name => "User", :foreign_key => "owner_id" 
    has_and_belongs_to_many :members, :class_name => "User", 
           :join_table => "groups_members", 
           :association_foreign_key => "member_id" 
end 

Ma question est: quelle est la meilleure solution (? Élégante) pour ajouter des actions dans le contrôleur de groupe, ainsi que routes à, tandis que le propriétaire voit son groupe (et tous membres), laissez-le voir qui n'est pas là et peut-être l'ajouter. Quelque chose comme:/groups/1/add_member/2. Même chose pour un utilisateur d'ajouter un groupe, alors qu'il voit sa page. J'ai réussi à le faire fonctionner, mais je voudrais voir comment il devrait être. Le problème est trop simple pour avoir une solution aussi compliquée que la mienne. Peut-être que la façon dont j'ai modélisé le problème n'est pas aussi la meilleure.

Juste pour le dossier, je suis un débutant complètement à Rails.

Veuillez commenter! Et merci d'avance!

Répondre

0

Vous souhaitez probablement créer un modèle de ressource imbriqué. Il adhère à REST, vous devrez donc gérer les conventions de nommage pour les URL.

resources :groups do 
    resources :users 
end 

Ceci est une bonne ressource: http://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default

Pour ajouter un utilisateur existant à un groupe existant, je définirais probablement une nouvelle route.

match '/groups/:group/users/add' => 'groups#add' 

Et ce dans le contrôleur

@group = Group.find params[:group] 
@user = User.find params[:user] 

@group.users << @user if @user 
+0

Au début, je pensais que trop, mais comment ajouter un utilisateur existant en tant que membre d'un groupe de cette façon? L'utilisateur de la ressource existe en dehors du groupe, et je veux juste l'ajouter au groupe. – gab

+0

Le nouveau bit en bas pourrait aider. –

Questions connexes