Bird
Raised Fist0
Rubyprogramming~30 mins

Group_by for categorization in Ruby - Mini Project: Build & Apply

Choose your learning style10 modes available
Group_by for categorization
📖 Scenario: You work at a bookstore that wants to organize books by their genre to make it easier for customers to find what they like.
🎯 Goal: You will create a Ruby program that groups a list of books by their genre using the group_by method.
📋 What You'll Learn
Create an array of hashes called books with each book having :title and :genre keys
Create a variable called grouped_books to store the result of grouping books by genre using group_by
Print the grouped_books variable to show books categorized by genre
💡 Why This Matters
🌍 Real World
Grouping items by category is common in apps like bookstores, music libraries, or inventory systems to help users find things easily.
💼 Career
Understanding how to group data efficiently is important for software developers working with collections, databases, or data analysis.
Progress0 / 4 steps
1
Create the books array
Create an array called books with these exact hashes: { title: 'The Hobbit', genre: 'Fantasy' }, { title: '1984', genre: 'Dystopian' }, { title: 'The Catcher in the Rye', genre: 'Classic' }, { title: 'The Lord of the Rings', genre: 'Fantasy' }, { title: 'Brave New World', genre: 'Dystopian' }
Ruby
Hint

Use square brackets [] to create an array and curly braces {} for each book hash.

2
Prepare to group books by genre
Create a variable called grouped_books and set it to nil for now as a placeholder.
Ruby
Hint

This step sets up a variable to hold the grouped result later.

3
Group the books by genre
Use the group_by method on the books array to group books by their :genre key. Assign the result to the variable grouped_books.
Ruby
Hint

Use group_by { |book| book[:genre] } to group books by genre.

4
Print the grouped books
Write a puts statement to print the grouped_books variable so you can see the books grouped by genre.
Ruby
Hint

Use puts grouped_books to display the grouped result.

Practice

(1/5)
1. What does the Ruby method group_by do when called on an array?
easy
A. It converts the array into a string.
B. It groups elements into a hash based on a given condition.
C. It removes duplicate elements from the array.
D. It sorts the array in ascending order.

Solution

  1. Step 1: Understand the purpose of group_by

    The group_by method organizes elements by a condition and returns a hash.
  2. Step 2: Compare with other array methods

    Sorting, removing duplicates, or converting to string are different methods like sort, uniq, or join.
  3. Final Answer:

    It groups elements into a hash based on a given condition. -> Option B
  4. Quick Check:

    group_by = groups hash [OK]
Hint: Remember: group_by returns a hash of grouped elements [OK]
Common Mistakes:
  • Confusing group_by with sort or uniq
  • Expecting an array instead of a hash
  • Thinking it changes element order only
2. Which of the following is the correct syntax to group an array nums by even or odd using group_by?
easy
A. nums.group_by(n % 2 == 0)
B. nums.group_by do n % 2 == 0 end
C. nums.group_by { |n| n % 2 == 0 }
D. nums.group_by ->(n) { n % 2 == 0 }

Solution

  1. Step 1: Recall block syntax for group_by

    The method requires a block with curly braces or do-end and a block variable.
  2. Step 2: Check each option's syntax

    nums.group_by { |n| n % 2 == 0 } uses correct block with { |n| ... }. nums.group_by(n % 2 == 0) misses block. nums.group_by do n % 2 == 0 end lacks block variable. nums.group_by ->(n) { n % 2 == 0 } uses lambda incorrectly.
  3. Final Answer:

    nums.group_by { |n| n % 2 == 0 } -> Option C
  4. Quick Check:

    Correct block syntax = nums.group_by { |n| n % 2 == 0 } [OK]
Hint: Use curly braces with block variable for group_by [OK]
Common Mistakes:
  • Omitting block variable in block
  • Passing condition as argument instead of block
  • Using lambda syntax incorrectly
3. What is the output of this Ruby code?
words = ['apple', 'banana', 'avocado', 'blueberry']
groups = words.group_by { |w| w[0] }
puts groups
medium
A. [["a", ["apple", "avocado"]], ["b", ["banana", "blueberry"]]]
B. ["apple", "avocado", "banana", "blueberry"]
C. {"apple"=>"a", "banana"=>"b"}
D. {"a"=>["apple", "avocado"], "b"=>["banana", "blueberry"]}

Solution

  1. Step 1: Understand group_by with first letter

    The block groups words by their first character, so keys are 'a' and 'b'.
  2. Step 2: Check output format of group_by

    It returns a hash with keys as letters and values as arrays of words starting with that letter.
  3. Final Answer:

    {"a"=>["apple", "avocado"], "b"=>["banana", "blueberry"]} -> Option D
  4. Quick Check:

    group_by first char = hash with arrays [OK]
Hint: group_by returns a hash, not an array or string [OK]
Common Mistakes:
  • Expecting an array instead of a hash
  • Confusing keys and values in output
  • Misreading output as string instead of hash
4. Identify the error in this Ruby code snippet:
numbers = [1, 2, 3, 4]
groups = numbers.group_by do n
  n.even?
end
puts groups
medium
A. Missing block variable in the do-end block.
B. group_by cannot be used with do-end blocks.
C. The method even? does not exist for integers.
D. The array must be sorted before using group_by.

Solution

  1. Step 1: Check block syntax for group_by

    The block must have a variable to represent each element, like do |n| ... end.
  2. Step 2: Identify the missing block variable

    The code uses do n without vertical bars, so n is treated as a local variable, causing error.
  3. Final Answer:

    Missing block variable in the do-end block. -> Option A
  4. Quick Check:

    Block variable required in do-end [OK]
Hint: Always use |variable| in do-end blocks [OK]
Common Mistakes:
  • Omitting vertical bars around block variable
  • Thinking even? is undefined for integers
  • Believing group_by needs sorted array
5. Given an array of hashes representing people:
people = [
  {name: 'Alice', age: 30},
  {name: 'Bob', age: 20},
  {name: 'Carol', age: 30},
  {name: 'Dave', age: 20}
]
Which code correctly groups people by their age using group_by?
hard
A. people.group_by { |person| person[:age] }
B. people.group_by { |person| person.name }
C. people.group_by { |person| person['age'] }
D. people.group_by { |person| person.age }

Solution

  1. Step 1: Understand data structure and access

    Each element is a hash with symbol keys like :age, so access with person[:age].
  2. Step 2: Check each option's key access

    people.group_by { |person| person[:age] } uses correct symbol key access. people.group_by { |person| person.name } and D use dot notation which doesn't work on hashes. people.group_by { |person| person['age'] } uses string key which is incorrect here.
  3. Final Answer:

    people.group_by { |person| person[:age] } -> Option A
  4. Quick Check:

    Hash keys accessed by symbols = people.group_by { |person| person[:age] } [OK]
Hint: Use symbol keys with [:key] to access hash values [OK]
Common Mistakes:
  • Using dot notation on hashes
  • Using string keys instead of symbols
  • Confusing array of hashes with objects
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard