2010-02-16 5 views
1

J'ai des utilisateurs qui sont membres de groupes via une table de jointure d'appartenance, et l'un des attributs de cette table de jointure est "administrator". J'essaie de faire un contrôle à l'intérieur de la vue des membres d'un groupe, en passant en revue chaque membre pour voir s'il est administrateur.Accéder aux valeurs dans une table has_many: through

De l'avis j'ai essayé les éléments suivants:

for user in @group.users 
    if user.administrator? 
    ...DO STUFF 
    end 
end 

J'ai aussi essayé ceci dans le contrôleur:

@administrators = @group.memberships.find(:all, :conditions => ["administrator = 1"]) 

Mais pas de chance. Des pensées?

MISE À JOUR - par-dessous, mettez une méthode dans le modèle de l'utilisateur:

def is_administrator_of(group_id) 
     Membership.find(:first, :conditions => ['user_id = ? AND group_id = ? AND administrator = ?', self[:id], group_id, true]) 
end 

Répondre

1

Bien que je pense que vous pouvez les associations de configuration pour accomplir cela, je pense que la meilleure façon de le faire serait d'ajouter une méthode à votre modèle d'utilisateur qui vous permet de vérifier pour chaque utilisateur (de cette façon, il s'intégrerait dans la boucle que vous avez fournie). Je ne sais pas si elle baissera à droite, il peut prendre quelques changements rapides mais vous pouvez commencer par quelque chose comme:

Modèle utilisateur

def is_administrator_of(group_id) 
    Membership.find(:first, :conditions => ['user_id = ? AND group_id = ?', self[:id], group_id]).administrator == 1 
end 
+0

Avec une très petite modification, cela a fonctionné génial. Je ne sais pas si le fait de réussir est la bonne façon de le faire, mais cela a bien fonctionné. Merci! Membership.find (: first,: conditions => ['id_utilisateur =? AND id_groupe =? AND administrateur =?', Self [: id], id_groupe, true]) –

2

Je pense que ce serait un moyen plus propre à faire

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 
    has_many :admins, :through => :memberships, :source => :user, 
      :conditions => ['memberships.administrator = ?', true] 
end 

Vous avez maintenant une liste de group.admins

for user in @group.admins 
    ...DO STUFF 
end 
+1

Les conditions doivent probablement lire 'memberships.administrator' comme table les noms sont pluralisés. – hurikhan77

+0

Comment puis-je faire référence à cela dans la vue - aurais-je encore besoin de la méthode is_administrator_of? ou serais-je capable de faire quelque chose comme: <% if @ user.group.admin? %> –

+0

merci pour les commentaires, j'ai mis à jour la réponse – giladbu

Questions connexes