我有一组用户数据,我想获得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记录调用。
答案 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)