はじめに
投稿2回目!
「画面上で複数人をランダムに2グループに分けたい」
「特定の条件の比率を揃えたい」
Rubyのメソッドを調べて試行錯誤した記録です
手順
- 条件を設ける
- ランダムにシャッフル
- シャッフルした者をグループに割り当てる
実装
①特定の条件に分ける
selectメソッドを使用
配列.select { |要素| 条件式 }
今回は男女比率を合わせる
controller.rb
male = students.select { |student| student.gender == "male" }
female = students.select { |student| student.gender == "female" }
②各グループの人数を決定
グループ数は2とします
controller.rb
group_count = 2
各グループの男女の人数を計算
controller.rb
male_per_group = (male.size.to_f / group_count).ceil
female_per_group = (female.size.to_f / group_count).ceil
Floatクラスのceilメソッドを使用
浮動小数点数.ceil
浮動小数点数を切り上げできます
③いよいよシャッフル!
contoroller.rb
male.shuffle!
female.shuffle!
元の配列自体を並び替えたいため破壊的メソッドを使用
配列.shuffle!
④グループごとに割り当てる
あとは、配列を用意し、割り当てるだけ
controller.rb
# グループ分けの結果を格納する配列
groups = []
# グループごとにそれぞれ割り当てる
group_count.times do |i|
group = []
# maleから割り当て
group.concat(male.shift(male_per_group))
# femaleから割り当て
group.concat(female.shift(female_per_group))
groups << group
end
# グループ分け結果をビューに渡す
@grouped = groups
メモ①「concatメソッド」
group.concat(引数)
concatで指定した引数がgroup配列に追加される
メモ②「shiftメソッド」
concatの引数
male.shift(数値)
female.shift(数値)
配列の先頭から指定した数の要素を取り出せる
メモ③演算子「<<」で 要素を追加
こちらに追加 << こちらから
まとめ
- selectメソッドで配列から特定の条件に合うものを選べる
- ceilで浮動点小数点を切り上げできる
- shuffle!で配列自体を並び替えられる
- concat メソッドで指定したものを配列に追加できる
- shiftメソッドで、配列の先頭から指定した要素を取り出せる
Rubyの文法が大切だと身に染みて感じました
2回目の投稿
ご指導、ご指南いただけると幸いです