1

I have a function users_by_role

and it returns data in following format,

[
  [#<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">]]
]

Now, I want to select users for given Role/s

I am using,

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

where project is a Project object

All good, code returns me the data but along with which I get following warning

warning: multiple values for a block parameter (2 for 1)

Also I am looking for optimized and shorter way of doing this

Complete code snippet looks like:

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

By above code I want to get all the user names for a given role.

1 Answer 1

1

The warning: it says that you expected 1 argt, and it passes 2. That's because it "expands the argts" to take account of the 2 elements array.

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

And for a better way:

If the role is uniq within the #users_by_role data returned, you can avoid a map.

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}"] }
Sign up to request clarification or add additional context in comments.

4 Comments

looks like i misunderstood the data returned by users_by_role. yes it should be project.users_by_role.select {|role, users|}
and regarding second answer, project.users_by_role.select {|role, users| role.name == "Developer" or role.name == Tester"}.first.last. wont give desired result. so this is what i am using, project.users_by_role.select {|role, users| role.name == "Developer" or role.name == "Reporter"}.collect{|role,users| users.map{|u| [u.id,u.firstname]}}.flatten(1).uniq
many thnx for figuring out the mistake. also would you like to comment on better way?
I assumed you wanted to retrieve only one role, so your way is fine.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.