chunkは意味合い単位で区切ってEnumratorして返してくれるメソッドでした。
今回紹介するgroup_byは条件毎に振り分けてハッシュで返してくれるメソッドです。
まずは基本のtrue/false
(1..10).map.group_by{|i| i > 2} #=> {false=>[1, 2], true=>[3, 4, 5, 6, 7, 8, 9, 10]} > list = [3,9] (1..10).map.group_by{|i| list.include?(i)} #=> {false=>[1, 2, 4, 5, 6, 7, 8, 10], true=>[3, 9]}
剰余で場合分けもできます。
> (1..10).map.group_by{|i| i % 3} => {1=>[1, 4, 7, 10], 2=>[2, 5, 8], 0=>[3, 6, 9]}
ActiveRecordとも連動できるので
@list = Professor.where(id: [5,39]) ##... @list.group_by{|i| i.positon == '准教授'}[true] Professor Load (2.7ms) SELECT `professors`.* FROM `professors` #=> {false=>[#<Professor id: 5...], true=> [#<Professor id: 7, name: "田中太郎", position: "准教授", ...>,#<Professor id: 37 ...]}