Bird
Raised Fist0
Ruby on Railsframework~20 mins

N+1 detection tools in Ruby on Rails - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
N+1 Query Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
Detecting N+1 queries with Bullet gem

Given a Rails app using the Bullet gem, what will Bullet report when rendering a view that loads Post records and then accesses each post's comments without eager loading?

Ruby on Rails
posts = Post.all
posts.each do |post|
  post.comments.each do |comment|
    puts comment.body
  end
end
ABullet will report a syntax error due to missing eager loading.
BBullet will not report any warnings because Post.all loads all posts at once.
CBullet will report an N+1 query warning because comments are accessed without eager loading.
DBullet will report a performance warning unrelated to N+1 queries.
Attempts:
2 left
💡 Hint

Think about what happens when you access an association inside a loop without eager loading.

📝 Syntax
intermediate
2:00remaining
Correct usage of includes to avoid N+1

Which option correctly uses includes to avoid N+1 queries when loading posts and their comments?

Ruby on Rails
posts = Post.???
posts.each do |post|
  post.comments.each do |comment|
    puts comment.body
  end
end
Aselect(:comments)
Bincludes(:comments)
Cpreload(:comments).where('comments.count > 0')
Djoins(:comments)
Attempts:
2 left
💡 Hint

Which method loads associated records to prevent extra queries?

🔧 Debug
advanced
2:00remaining
Identifying cause of false positive N+1 detection

Using the Bullet gem, you get an N+1 warning on user.profile even though you used includes(:profile). What is the most likely cause?

Ruby on Rails
users = User.includes(:profile).where(active: true)
users.each do |user|
  puts user.profile.bio
end
AThe <code>profile</code> association uses a custom SQL that disables eager loading.
BYou forgot to call <code>references(:profile)</code> along with <code>includes</code>.
CThe <code>profile</code> association is defined with <code>optional: true</code>, causing Bullet to misdetect.
DBullet cannot detect N+1 queries on <code>has_one</code> associations.
Attempts:
2 left
💡 Hint

Think about how custom SQL in associations affects eager loading.

🧠 Conceptual
advanced
2:00remaining
Understanding Skylight's N+1 detection approach

How does Skylight detect N+1 queries in a Rails application?

ABy scanning the source code for missing <code>includes</code> calls in ActiveRecord queries.
BBy monitoring CPU usage spikes during database calls.
CBy requiring manual annotations in the code to mark potential N+1 spots.
DBy analyzing the number of similar SQL queries executed during a single request and flagging repeated queries on associations.
Attempts:
2 left
💡 Hint

Think about how a tool can detect repeated queries dynamically.

❓ state_output
expert
3:00remaining
Output of Rack Mini Profiler on N+1 queries

Given this Rails controller code, what output will Rack Mini Profiler show regarding database queries?

def index
  @users = User.all
  @users.each do |user|
    user.posts.each do |post|
      puts post.title
    end
  end
end
AIt will show 1 query for users and multiple queries for posts, indicating an N+1 problem.
BIt will show a single optimized query joining users and posts.
CIt will show no database queries because data is cached.
DIt will show a syntax error in the controller code.
Attempts:
2 left
💡 Hint

Consider how accessing associations inside loops affects query count.

Practice

(1/5)
1. What is the main purpose of N+1 detection tools in a Rails application?
easy
A. To style the user interface
B. To add new features automatically
C. To find repeated database queries that slow down the app
D. To manage user authentication

Solution

  1. Step 1: Understand what N+1 problem means

    The N+1 problem happens when the app makes many repeated database queries instead of one efficient query.
  2. Step 2: Identify the role of detection tools

    N+1 detection tools help find these repeated queries so developers can fix them and speed up the app.
  3. Final Answer:

    To find repeated database queries that slow down the app -> Option C
  4. Quick Check:

    N+1 detection = find repeated queries [OK]
Hint: N+1 tools catch repeated queries slowing your app [OK]
Common Mistakes:
  • Thinking N+1 tools add features
  • Confusing with UI styling tools
  • Assuming they handle authentication
2. Which gem is commonly used in Rails to detect N+1 query problems?
easy
A. Devise
B. Sidekiq
C. Puma
D. Bullet

Solution

  1. Step 1: Recall popular Rails gems for N+1 detection

    Bullet gem is well-known for detecting N+1 queries and unused eager loading.
  2. Step 2: Differentiate from other gems

    Devise handles authentication, Puma is a server, Sidekiq manages background jobs, so they don't detect N+1 queries.
  3. Final Answer:

    Bullet -> Option D
  4. Quick Check:

    Bullet gem = N+1 detection [OK]
Hint: Bullet gem is for N+1 detection in Rails [OK]
Common Mistakes:
  • Choosing Devise for N+1 detection
  • Confusing server or job gems with detection tools
  • Not knowing Bullet gem purpose
3. Given this Rails code snippet, what will Bullet gem detect?
posts = Post.all
posts.each do |post|
  puts post.comments.count
end
medium
A. N+1 query problem because comments are queried inside the loop
B. Syntax error in the code
C. No issues, code is efficient
D. Bullet will detect missing authentication

Solution

  1. Step 1: Analyze the code for database queries

    The code loads all posts, then inside the loop queries comments count for each post separately.
  2. Step 2: Understand what Bullet detects

    Bullet detects N+1 queries, which happen here because each post triggers a separate query for comments.
  3. Final Answer:

    N+1 query problem because comments are queried inside the loop -> Option A
  4. Quick Check:

    Loop querying associations = N+1 problem [OK]
Hint: Loop querying associations causes N+1 detected by Bullet [OK]
Common Mistakes:
  • Thinking code is efficient without eager loading
  • Confusing Bullet with syntax checker
  • Assuming Bullet checks authentication
4. You see Bullet gem warnings about N+1 queries in your Rails app. Which fix will solve this problem?
posts = Post.all
posts.each do |post|
  puts post.comments.count
end
medium
A. Remove the loop and print posts only
B. Add .includes(:comments) to the query
C. Add .order(:created_at) to the query
D. Change post.comments.count to post.comments.first

Solution

  1. Step 1: Identify the cause of N+1 queries

    Each post triggers a separate query for comments count, causing many queries.
  2. Step 2: Apply eager loading to fix N+1

    Using .includes(:comments) loads all comments with posts in one query, preventing repeated queries.
  3. Final Answer:

    Add .includes(:comments) to the query -> Option B
  4. Quick Check:

    Eager load associations with includes to fix N+1 [OK]
Hint: Use includes(:association) to fix N+1 queries [OK]
Common Mistakes:
  • Thinking ordering fixes N+1
  • Removing loop doesn't fix data needed
  • Changing count to first doesn't fix queries
5. In a Rails app using Bullet gem, you notice it reports N+1 queries on nested associations like user.posts.comments. How can you fix this efficiently?
hard
A. Use .includes(posts: :comments) when loading users
B. Load users, posts, and comments separately in different queries
C. Remove comments from the view to avoid queries
D. Use .joins(:posts, :comments) without includes

Solution

  1. Step 1: Understand nested N+1 queries

    Accessing user.posts.comments triggers queries for posts and then comments for each post, causing nested N+1 problems.
  2. Step 2: Use nested eager loading

    Using .includes(posts: :comments) loads users with posts and their comments in minimal queries, fixing nested N+1.
  3. Final Answer:

    Use .includes(posts: :comments) when loading users -> Option A
  4. Quick Check:

    Nested includes fix nested N+1 queries [OK]
Hint: Use nested includes for nested associations to fix N+1 [OK]
Common Mistakes:
  • Loading associations separately causing more queries
  • Removing data instead of fixing queries
  • Using joins without includes misses eager loading
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