2012-05-30 213 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为了找出错误,你还想评论一下更好的方法吗? –