我想知道实现以下内容的最佳方法

时间:2014-11-05 16:06:52

标签: ruby-on-rails ruby arrays hash enumerable

我有一组用户数据,我想获得first_name所有这些用户。我们可以简单地使用

user_list.map(&:first_name)

同样对于中间名和姓氏,我需要做同样的事情

user_list.map(&:middle_name)
user_list.map(&:last_name)

正如我们在这里看到的,我必须循环使用相同的数据3次才能获得第一个,中间名和姓氏的集合。任何人都可以建议我在一个循环中做到这一点。

所以输出就像。

{first_name: ["tom", "harry", "ronald"], middle_name: ["marvello", "james", "bilius"], last_name: ["riddle", "potter", "weasley"] }

PS,它不是一个使用pluck的活动记录调用。它是我需要运行它的记录集合,而不是Active记录调用。

3 个答案:

答案 0 :(得分:2)

一个明显的解决方案是each循环:

names = {first_name: [], middle_name: [], last_name: []}    
user_list.each do |user|
  names[:first_name] << user.first_name
  names[:middle_name] << user.middle_name
  names[:last_name] << user.last_name
end

或使用each_with_object

user_list.each_with_object(first_name: [], middle_name: [], last_name: []) do |user, names|
  names[:first_name] << user.first_name
  names[:middle_name] << user.middle_name
  names[:last_name] << user.last_name
end

答案 1 :(得分:1)

user_attributes = ['first_name','middle_name','last_name']
# A hash to hold final result
hsh = HashWithIndifferentAccess.new
user_attributes.each do |attr|
  hsh[attr] = user_list.collect {|i| i.send(attr)}
end 
#Result
#$hsh
#{first_name: [...],middle_name: [...],last_name: [...]}

更新

由于上面的答案有3次迭代,你可以单独通过flat_map

来完成
user_attributes = [:first_name,:middle_name,:last_name]
collection = user_list.flat_map { |user| [{first_name: user.first_name,middle_name: user.middle_name,last_name: user.last_name}] }


# A hash to hold final result, as u need then as collection. aggregating the independent keys
hsh = HashWithIndifferentAccess.new
user_attributes.each {|attr| hsh[attr] = collection.collect {|i| i[attr] }

答案 2 :(得分:0)

查看pluck

user_list.pluck(:first_name, :middle_name, :last_name)

它适用于ActiveRecord结果。