2012-05-30 65 views
1

我有users_by_role:在紅寶石

的函數,並且它在下面的格式返回數據「警告一個塊參數(2 1)的多個值」,

[ 
    [#<Role id: 1, name: "Developer">,[#<User id:1, name: "Abc">,#<User id:2, name: "xyz">]] 
    [#<Role id: 2, name: "Tester">,[#<User id:11, name: "Abcd">,#<User id:12, name: "wxyz">]] 
] 

現在,我想選擇用戶給定角色/ s的

我使用,

project.users_by_role.select{|o| o.first.name == "Developer"} 

,其中項目是項目對象

都好,代碼返回我的數據,但在沿着我得到以下警告

警告:一個塊參數的多個值(2 1)

而且我要找優化,這樣做

完整的代碼片段的短的方式是這樣的:

project.users_by_role.select{|o| o.first.name == "Developer" }.collect{|e| e.last.map{|f| [f.id,f.firstname + ' ' + f.lastname]}}.flatten(1).uniq 

通過上面的代碼我想獲得給定角色的所有用戶名。

回答

1

警告:它說,你預期的1個argt,並將它傳遞2. 這是因爲它「擴大argts」考慮到2個元素數組。

project.users_by_role.select {|role, users| role.name == "Developer"} 

而對於一個更好的辦法:

如果角色是uniq的內#users_by_role返回的數據,就可以避免地圖。

users = project.users_by_role.select {|role, users| role.name == "Developer"}.first.last 
users_for_select = users.map {|user| [user.id, "#{user.firstname} #{user.lastname}"] } 
+0

貌似我誤解了users_by_role返回的數據。是的,它應該是project.users_by_role.select {| role,users |} –

+0

並且關於第二個答案,project.users_by_role.select {| role,users | project.users_by_role.select {| role,users | role.name =「role.name ==」Developer「or role.name == Tester」}。first.last.wont give give desired result。所以這就是我正在使用的,project.users_by_role.select { =「Developer」or role.name ==「Reporter」}。collect {| role,users | users.map {| u | [u.id,u.firstname]}}。flatten(1).uniq –

+0

很多thnx爲了找出錯誤,你還想評論一下更好的方法嗎? –