2010-02-16 29 views
1

我有通过成员连接表成为组的成员的用户,并且该连接表的属性之一是“管理员”。我试图在组的成员视图中进行检查,循环遍历每个成员以查看它们是否是管理员。通过连接表访问has_many中的值

在视图中我尝试了以下内容:

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

我也试过这个控制器:

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

,但没有运气。有什么想法吗?

更新 - 每下面,把一个方法到用户模式:

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

回答

1

虽然我认为你可以设置关联来实现这一点,我认为这样做是添加的方法最简单的方法到您的用户模型,允许您检查每个用户(这种方式适合您提供的循环)。我不知道这是否会降权的话,可能需要几个简单的变化,但你可能喜欢的东西开始:

用户模型

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

通过非常小的修改,这工作真棒。不确定是否有正确的方法去实现,但效果很好。谢谢! Membership.find(:first,:conditions => ['user_id =?AND group_id =?AND administrator =?',self [:id],group_id,true]) – 2010-02-16 00:29:12

2

我认为这将是更清洁的方式做到这一点

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

您现在有一个group.admins列表

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

条件应该可以读为'memberships.administrator'as table名字是复数。 – hurikhan77 2010-02-16 07:09:07

+0

我怎么会在视图中引用 - 我是否仍然需要is_administrator_of方法?或者我能够做些什么: <%if @ user.group.admin? %> – 2010-02-16 17:31:09

+0

感谢您的意见,我更新了答案 – giladbu 2010-02-17 18:21:10

相关问题