2010-02-16 49 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

相關問題