我有一个函数users_by_role
并以下列格式返回数据
[
[#<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">]]
]
现在,我想选择给定角色的用户
我正在使用,
project.users_by_role.select{|o| o.first.name == "Developer"}
其中project是Project对象
一切顺利,代码会返回数据,但随后我会收到警告
警告:块参数的多个值(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
通过上面的代码,我想获得给定角色的所有用户名。
答案 0 :(得分:1)
警告:它表示您预计1个argt,并且它通过2。 那是因为它“扩展了argts”以考虑2个元素数组。
project.users_by_role.select {|role, users| role.name == "Developer"}
以更好的方式:
如果角色在返回的#users_by_role数据中是uniq,则可以避免使用地图。
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}"] }