【ruby】【備忘録】ユーザをいくつかのグループに分ける・カウントする

備忘録
記事のタイトルと冒頭文のテストをする。 そのために、オブジェクト(ユーザ)を4つのグループに分けたい。 分け方に対する議論は一旦置いておいて、ひとまずidで順番にグループ分けをしてみる。

User = Struct.new(:id, :email, :test_pattern)
users = 57.times.map do |i|
  User.new(i, "user#{i}", { title: i % 2, statement: (i % 4) / 2})
end
# => [
#   <struct User id=0, email="user0", test_pattern={:title=>0, :statement=>0}>,
#   <struct User id=1, email="user1", test_pattern={:title=>1, :statement=>0}>,
#   <struct User id=2, email="user2", test_pattern={:title=>0, :statement=>1}>,
#   <struct User id=3, email="user3", test_pattern={:title=>1, :statement=>1}>,
#   ...
#   <struct User id=56, email="user56", test_pattern={:title=>0, :statement=>0}>
# ]

それぞれ何パターンずつ出力したのかカウントする

test_pattern_count = users.inject([]) do |array, user|
  array[user.test_pattern[:title]] ||= []
  array[user.test_pattern[:title]][user.test_pattern[:statement]] ||= 0
  array[user.test_pattern[:title]][user.test_pattern[:statement]] += 1
  array
end

info = "パターン別カウント\n"
test_pattern_count.each_with_index do |array, i|
  array.each_with_index do |count, j|
    info << "パターン#{i}_#{j}#{count}\n"
  end
end

puts info
# =>パターン別カウント
#   パターン0_0:15
#   パターン0_1:14
#   パターン1_0:14
#   パターン1_1:14

これでとりあえず出来たけど、テストする箇所が増えたりパターンが増えたりすると、 結構描き直さないと対応できない。
ただテストのパターンはころころ変わるしテストしない期間もあるためこんなもん?