2011-09-15 3 views
0

J'ai un utilisateur de classe, qui a de nombreux événements et appartient à plusieurs groupes. Je souhaite autoriser l'utilisateur à créer un événement et à restreindre l'utilisateur qu'il souhaite inviter par groupe, par ID utilisateur ou par les deux.Rails boîte de sélection multiple pour différents modèles

Comment autoriser l'utilisation de plusieurs balises de zone de sélection qui indiquent que les groupes et les individus peuvent être sélectionnés? Je pense à créer quelque chose comme acts_as, mais cela semble être inutilement compliqué.

Répondre

1

AVERTISSEMENT !!! Première solution d'itération - cela pourrait être plus simple

Vous pourriez avoir besoin d'une relation polymorphe pour réaliser le mappage.

Event 
    has_many :invitations 
    has_many :user_invitations, :class_name => "Invitation", :conditions => "inviteable_type = 'User'" 
    has_many :group_invitations, :class_name => "Invitation", :conditions => "inviteable_type = 'Group'" 


Invitation 
    belongs_to :inviteable, :polymorphic => true 
    #Invitations table would have inviteable_id, inviteable_type columns 
User 
    has_many :invitations, :as => :inviteable 
Group 
    has_many :invitations, :as => :inviteable 

Maintenant, vous pouvez avoir `Event.first.inviteables (cela renvoie une collection d'utilisateurs et groupes)

Selon vous, nommez les options pour vos 2 collections différentes, par exemple:

<select name='event[event_inviteables]' ...> 
<option value='group[][1]'>Group 1</option> 
.. 
<option value='user[][1]'>User 1</option> 

Dans votre modèle d'événement, vous aurez besoin d'avoir une méthode event_inviteables= pour déterminer ceux qui sont les utilisateurs, et ceux qui sont des groupes et mettre à jour les collections inviteable en conséquence

Event 
    def event_inviteables=(*args) 
    user_ids = #some magic to extract user_ids from args 
    group_ids = #some magic to extract group_ids from args 
    self.user_invitation_ids = user_ids 
    self.group_invitation_ids = group_ids 
    end 
+0

Merci beaucoup pour une réponse détaillée. J'ai obtenu la première partie à droite (association polymorphique) et je peux appeler Event.first.invitables. Cependant, je ne peux pas implémenter la deuxième partie, à savoir, l'étiquette de case à cocher. (Je suis désolé de confondre la boîte de sélection avec check_box). Comme vous le savez très bien, pour check_box_tag, je dois passer un tableau [id, class_name] au lieu de simplement id: invitable => {{id => "1", name => "Utilisateur"}, {id => " 4 ", nom =>" Groupe "}}. Comment devrais-je utiliser votre solution pour l'étiquette de case à cocher? Merci encore. – AdamNYC

+0

La case à cocher prend le nom et la valeur uniquement l'événement '<% ​​= check_box_tag '[event_inviteables] [utilisateur] []', user.id%><% = check_box_tag 'événement [event_inviteables] [groupe] []', group.id %> '(bien sûr, vous devez également tester si l'utilisateur doit être coché ou non dans la page d'édition d'événement). – tamersalama

Questions connexes