2012-05-13 18 views
1

我正在考慮在has_many關係之間添加一些額外的屬性。雖然在has_many關係中使用時訪問連接表中的額外屬性

例如,我有一個Users表和一個Group表。用戶可以通過has_many關係加入羣組。我想添加用戶在該組中的'角色'屬性。

create_table "groupization", :force => true do |t| 
    t.integer "user_id" 
    t.integer "group_id" 
    t.string "role" 
    t.datetime "created_at",      :null => false 
    t.datetime "updated_at",      :null => false 
    end 

我在想,我怎樣才能訪問角色屬性。我在想這樣的事:

user.groups[0].role 

這是一個正確的方法嗎?我知道語法錯了(我試過了);正確的語法會是什麼樣子?謝謝!

回答

2

在用戶模式,你就會有類似:

你只通過在控制檯中has_many關係groupizations這樣的訪問角色信息。

foo = User.first 
bar = foo.groupizations.first 
bar.role 

假設您對第一個用戶進行了分組。

獲取特定的用戶/組關係可以做這樣的:

Groupizations.where("group_id = ? and user_id = ?", group.id, user.id) 

然後從那裏你可以得到你想要的角色。

3

我不認爲有一個優雅的方式來做到這一點,僅僅是這樣的:

user.groupizations.find_by_group_id(user.groups[0].id).role 

你與[0]給的示例代碼似乎並不像一個現實的使用,所以如果你表現我們如何實際上想要訪問role,可能有更清晰的方法。

這被討論了here

+0

我認爲這可以稍微簡化爲'user.groupizations.find_by_group_id(user.groups.first).role'。在Rails 3.1或更新版本中,使用'#first'也應該更快,因爲它將檢索單行,而'#[]'將強制檢索所有記錄。 –

+0

是的,我最初有'user.groups.first',但我改變它以保持與@Newton在問題中如何訪問組。但就像我說的,無法想象爲什麼只有第一組的「角色」會像這樣被任意訪問。 –

+0

我想我雖然不清楚。簡化只是省略了'.id'。您通常可以將模型實例作爲查找器參數傳遞,並且ActiveRecord知道它應該使用該值。 –

1

目前還不清楚你在找什麼,所以我會用控制檯輸出來拋出另一個例子,以使它更清楚它發生了什麼。然而,要指出的是,爲了得到用戶的角色,你需要指定你的用戶組中的哪一個組(如@BuckDoyle所示,儘管他只是選擇第一個來鏡像你的例子) 。要獲取所有用戶角色的列表,您需要遍歷用戶的分組。

1.9.3-p194 :050 > User.find_by_name("Homer").groupizations.each {|groupization| 
       puts groupization.group.org + ': ' + groupization.role} 

User Load (2.8ms) SELECT "users".* FROM "users" WHERE "users"."name" = 'Homer' LIMIT 1 
Groupization Load (1.5ms) SELECT "groupizations".* FROM "groupizations" WHERE 
"groupizations"."user_id" = 2 

Group Load (1.9ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = 1 
LIMIT 1 

The Movementarians: cult follower 

Group Load (1.4ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = 2 
LIMIT 1 

Nuclear Plant: employee 

最後一個思想(一種微不足道的一)「groupizations」當然有效,但如果「角色」是唯一的屬性,你要添加,更具體命名的關係模型(說「成員」)有一個實際的好處,因爲它使關係更清晰一點,至少在我的經驗。

2

最好的方法是使用連接模型,然後將代理/代理方法委託給組,例如,G:

class User < ActiveRecord::Base 
    has_many :memberships, :include => :group, :dependent => :delete_all 
    has_many :groups, :through => :memberships 
end 

class Group < ActiveRecord::Base 
    has_many :memberships, :include => user, :dependent => :delete_all 
    has_many :users, :through => :memberships 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 

    def group_name 
    group && group.name 
    end 

    def user_name 
    user && user.name 
    end 
end 

然後,如果你是在一個視圖中顯示用戶的組:

<ul> 
<% @user.memberships.each do |membership| %> 
    <li><%= membership.group_name %> (<%= membership.role %>)</li> 
<% end %> 
</ul> 

類似地,對於集團用戶:

<ul> 
<% @group.memberships.each do |membership| %> 
    <li><%= membership.user_name %> (<%= membership.role %>)</li> 
<% end %> 
</ul> 

這樣只需要三個查詢 - 一個每個用戶,組和會員。

相關問題