将一组记录分组,获取IDS而不是对象

时间:2014-11-03 07:18:32

标签: ruby

只是一个简短的问题。

u.quizzes.group_by(&:section_id)

回复我

{1=>
  [#<Quiz id: 263, user_id: 2, exam_or_section: "section", section_id: 1>,
   #<Quiz id: 264, user_id: 2, exam_or_section: "section", section_id: 1>,
   #<Quiz id: 265, user_id: 2, exam_or_section: "section", section_id: 1>,
   #<Quiz id: 266, user_id: 2, exam_or_section: "section", section_id: 1>,
   #<Quiz id: 267, user_id: 2, exam_or_section: "section", section_id: 1>,
   #<Quiz id: 268, user_id: 2, exam_or_section: "section", section_id: 1>],
 2=>[#<Quiz id: 269, user_id: 2, exam_or_section: "section", section_id: 2>],
 3=>[#<Quiz id: 270, user_id: 2, exam_or_section: "section", section_id: 3>]}

是否有一种简单的方法来获取ids数组而不是对象?

{1=> [263,264,265, 266, 267, 268], 2=>[269], 3=> [270]}

谢谢

3 个答案:

答案 0 :(得分:1)

u.quizzes.select(:id, :section_id).group_by(&:section_id).each {|k, v| v.map!(&:id) }

select并不是严格要求但应该使用,因为其他字段没有以任何方式使用,你会在数据库和rails之间传输无用的数据。

答案 1 :(得分:0)

您可以使用map

u.quizzes.group_by(&:section_id).map { |item| 
  [item.first, item.last.map { |q| q.id } ]
}.to_h

希望它有所帮助。

答案 2 :(得分:0)

这样做会非常好。

u.quizzes.reduce({}) { |hash, quiz|
  hash[quiz.section_id] = Array(hash[quiz.section_id]) << quiz.id
  hash
}

正如p11y建议each_with_object

u.quizzes.each_with_object({}) { |quiz, hash|
  hash[quiz.section_id] = Array(hash[quiz.section_id]) << quiz.id
}