Skip to content

Commit 1accc09

Browse files
committed
feat(seeds): generate more workshops for performance testing
Motivation: The existing seeds.rb generated ~60 past workshops, which was insufficient for detecting performance issues during local development. With more data, N+1 queries and missing indexes become immediately obvious. Analysis: - Original seeds: ~60 past workshops over 5 years (1 every 6 months) - New seeds: ~1000 past workshops + ~100 future workshops - Scaled coaches/students from 50 to 500 each - Added ~25,000 workshop invitations for realistic query patterns This makes performance issues visible early in development rather than surfacing in production. Fixes #2302
1 parent 6906388 commit 1accc09

1 file changed

Lines changed: 75 additions & 65 deletions

File tree

db/seeds.rb

Lines changed: 75 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,124 @@
11
if Rails.env.development?
22
# Check for ImageMagick before seeding
33
imagemagick_available = system('convert --version > /dev/null 2>&1') ||
4-
system('magick --version > /dev/null 2>&1')
4+
system('magick --version > /dev/null 2>&1')
55

66
unless imagemagick_available
7-
Rails.logger.error "=" * 80
8-
Rails.logger.error "ERROR: ImageMagick is required to run db:seed"
9-
Rails.logger.error "=" * 80
10-
Rails.logger.error ""
11-
Rails.logger.error "The seed task processes sponsor logo images, which requires ImageMagick."
12-
Rails.logger.error ""
13-
Rails.logger.error "Install ImageMagick:"
14-
Rails.logger.error " macOS: brew install imagemagick"
15-
Rails.logger.error " Ubuntu/Debian: apt-get install imagemagick"
16-
Rails.logger.error " Windows: https://imagemagick.org/script/download.php"
17-
Rails.logger.error ""
18-
Rails.logger.error "See native-installation-instructions.md for details."
19-
Rails.logger.error "=" * 80
7+
Rails.logger.error '=' * 80
8+
Rails.logger.error 'ERROR: ImageMagick is required to run db:seed'
9+
Rails.logger.error '=' * 80
10+
Rails.logger.error ''
11+
Rails.logger.error 'The seed task processes sponsor logo images, which requires ImageMagick.'
12+
Rails.logger.error ''
13+
Rails.logger.error 'Install ImageMagick:'
14+
Rails.logger.error ' macOS: brew install imagemagick'
15+
Rails.logger.error ' Ubuntu/Debian: apt-get install imagemagick'
16+
Rails.logger.error ' Windows: https://imagemagick.org/script/download.php'
17+
Rails.logger.error ''
18+
Rails.logger.error 'See native-installation-instructions.md for details.'
19+
Rails.logger.error '=' * 80
2020
exit 1
2121
end
2222

2323
begin
2424
Rails.logger.info 'Running migrations...'
2525
Rails.application.config.log_level = :info
26-
Rails.logger.info "Creating chapters..."
27-
chapters = ['London', 'Brighton', 'Cambridge', 'Barcelona', 'Paris', 'Merlbourne', 'Berlin', 'New York'].map do |name|
26+
Rails.logger.info 'Creating chapters...'
27+
chapters = ['London', 'Brighton', 'Cambridge', 'Barcelona', 'Paris', 'Merlbourne', 'Berlin',
28+
'New York'].map do |name|
2829
Fabricate(:chapter_with_groups, name: name)
2930
end
3031

31-
Rails.logger.info "Creating workshops..."
32-
workshops = 6.times.map do |n|
33-
start = Time.zone.now + 1.month - n.weeks
34-
ends_at = start + 3.hours
35-
Fabricate(:workshop, title: 'Workshop',
32+
Rails.logger.info 'Creating workshops...'
33+
34+
Rails.logger.info 'Creating 1000 past workshops...'
35+
past_workshops = []
36+
1000.times do
37+
months_ago = rand(0..60)
38+
start = Time.zone.now - months_ago.months + rand(0..28).days + rand(0..23).hours
39+
workshop = Fabricate(:workshop,
40+
title: 'Workshop',
3641
chapter: chapters.sample,
3742
date_and_time: start,
38-
ends_at: ends_at)
43+
ends_at: start + 3.hours)
44+
past_workshops << workshop
3945
end
4046

41-
workshops.concat Fabricate.times(2, :workshop, title: 'Workshop', chapter: chapters.sample)
42-
43-
Rails.logger.info "Creating a lot of old workshops..."
44-
past_workshops_since_n_months = 5 * 12
45-
past_workshops_one_per_n_months = 6
46-
past_workshops_count = past_workshops_since_n_months/past_workshops_one_per_n_months
47-
48-
past_workshops = past_workshops_count.times.map do |n|
49-
Fabricate(:workshop, title: 'Workshop',
47+
Rails.logger.info 'Creating 100 future workshops...'
48+
future_workshops = []
49+
100.times do
50+
months_ahead = rand(1..12)
51+
start = Time.zone.now + months_ahead.months + rand(0..28).days + rand(0..23).hours
52+
workshop = Fabricate(:workshop,
53+
title: 'Workshop',
5054
chapter: chapters.sample,
51-
date_and_time: Time.zone.now - past_workshops_since_n_months.months + (past_workshops_one_per_n_months * n).months)
55+
date_and_time: start,
56+
ends_at: start + 3.hours)
57+
future_workshops << workshop
5258
end
5359

54-
Rails.logger.info "Creating events..."
60+
future_workshops.first(10)
61+
62+
Rails.logger.info 'Creating events...'
5563
events = 20.times.map do |n|
5664
Fabricate(:event, name: 'Event',
5765
chapters: chapters.sample(4),
5866
date_and_time: Time.zone.now + 2.months - n.months)
5967
end
6068

61-
Rails.logger.info "Creating meetings..."
69+
Rails.logger.info 'Creating meetings...'
6270

6371
20.times.map do |n|
6472
Fabricate(:meeting, name: 'Meeting',
6573
date_and_time: Time.zone.now + 1.month - n.months)
6674
end
6775

68-
Rails.logger.info "Creating coaches..."
69-
coaches = 50.times.map { Fabricate(:coach, groups: Group.coaches.order('RANDOM()').limit(2)) }
76+
Rails.logger.info 'Creating coaches...'
77+
coaches_group = Group.coaches.to_a
78+
students_group = Group.students.to_a
79+
coaches = 500.times.map { Fabricate(:coach, groups: coaches_group.sample(2)) }
7080
tutorials = Fabricate.times(20, :tutorial)
7181
30.times { Fabricate(:feedback_request, workshop: past_workshops.sample) }
7282
20.times { Fabricate(:feedback, tutorial: tutorials.sample, coach: coaches.sample) }
7383
10.times { Fabricate(:testimonial, member: coaches.sample) }
7484

75-
job_titles = [
76-
'Software Engineer',
77-
'Software Developer',
78-
'Front-end Developer',
79-
'Back-end Developer',
80-
'Full-stack Developer'
81-
]
82-
83-
job_companies = %w[
84-
ACME
85-
Globex
86-
Soylent
87-
Initech
88-
Umbrella
89-
Wonka
90-
]
85+
Rails.logger.info 'Creating students...'
86+
students = 500.times.map { Fabricate(:student, groups: students_group.sample(2)) }
9187

92-
Rails.logger.info "Creating students..."
93-
students = 50.times.map { Fabricate(:student, groups: Group.students.order('RANDOM()').limit(2)) }
94-
95-
Rails.logger.info "Creating event invitations..."
96-
10.times do |n|
88+
Rails.logger.info 'Creating event invitations...'
89+
10.times do |_n|
9790
Fabricate(:invitation, member: students.sample, event: events.sample)
9891
Fabricate(:coach_invitation, member: coaches.sample, event: events.sample)
9992
end
10093

101-
Rails.logger.info "Creating attended by coach workshop invitations..."
102-
coaches.sample(15).each do |coach|
103-
past_workshops.sample(3).each do |workshop|
104-
Fabricate(:attended_coach, workshop: workshop, member: coach)
94+
Rails.logger.info 'Creating workshop invitations for past workshops...'
95+
past_workshops.each do |workshop|
96+
invitation_count = rand(8..15)
97+
invitation_count.times do
98+
Fabricate(:coach_workshop_invitation, member: coaches.sample, workshop: workshop)
99+
rescue StandardError
100+
nil
101+
end
102+
invitation_count.times do
103+
Fabricate(:student_workshop_invitation, member: students.sample, workshop: workshop)
104+
rescue StandardError
105+
nil
105106
end
106107
end
107108

108-
Rails.logger.info "Creating workshop invitations..."
109-
30.times do |n|
110-
Fabricate(:coach_workshop_invitation, member: coaches.sample, workshop: workshops.sample) rescue nil
111-
Fabricate(:student_workshop_invitation, member: students.sample, workshop: workshops.sample) rescue nil
109+
Rails.logger.info 'Creating workshop invitations for future workshops...'
110+
future_workshops.each do |workshop|
111+
invitation_count = rand(10..20)
112+
invitation_count.times do
113+
Fabricate(:coach_workshop_invitation, member: coaches.sample, workshop: workshop)
114+
rescue StandardError
115+
nil
116+
end
117+
invitation_count.times do
118+
Fabricate(:student_workshop_invitation, member: students.sample, workshop: workshop)
119+
rescue StandardError
120+
nil
121+
end
112122
end
113123
Rails.logger.info '..done!'
114124
rescue Exception => e

0 commit comments

Comments
 (0)