DEV Community

Germán Alberto Gimenez Silva
Germán Alberto Gimenez Silva

Posted on • Originally published at rubystacknews.com on

Seeds on Rails: The Best Way to Create and Feed Your Rails Database

February 13, 2025

Seeding a database is an essential step in Rails development, whether you’re setting up a new project, testing features, or ensuring a smooth onboarding experience for new developers. Rails seeds allow you to populate your database with default values quickly and efficiently.

In this article, we’ll explore best practices, tools, and techniques to make your database seeding faster, cleaner, and more maintainable.


🚀 Why Use Seeds in Rails?

Seeding is useful for:

  • Creating default data for a fresh development environment.
  • Populating databases for testing or demo purposes.
  • Ensuring consistent initial data across environments.

The standard way to seed data in Rails is by using the db/seeds.rb file and running:

dis rails db:seed 
Enter fullscreen mode Exit fullscreen mode

This executes the Ruby code inside seeds.rb, inserting records into the database.


🌱 Best Practices for Seeding in Rails

1⃣ Keep Seeds Idempotent

Your seed file should be safe to run multiple times without duplicating data. Instead of using create!, prefer find_or_create_by:

User.find_or_create_by(email: 'admin@example.com') do |user|
  user.name = 'Admin'
  user.password = 'securepassword'
end 
Enter fullscreen mode Exit fullscreen mode

This ensures that if the record already exists, it won’t be created again.

2⃣ Use Faker for Realistic Data

For testing or development environments, using Faker helps generate realistic data:

10.times do
  User.create!(name: Faker::Name.name, email: Faker::Internet.email, password: 'password')
end 
Enter fullscreen mode Exit fullscreen mode

Add faker to your Gemfile:

gem 'faker' 
Enter fullscreen mode Exit fullscreen mode

Then run:

bundle install 
Enter fullscreen mode Exit fullscreen mode

3⃣ Use ActiveRecord-Import for Bulk Inserts

Seeding large amounts of data can be slow if each record is created individually. ActiveRecord-Import speeds this up by performing bulk inserts:

users = []
10_000.times do
  users << User.new(name: Faker::Name.name, email: Faker::Internet.email, password: 'password')
end
User.import users 
Enter fullscreen mode Exit fullscreen mode

This method is much faster than calling create! inside a loop.

4⃣ Organize Seeds into Multiple Files

Instead of dumping everything into seeds.rb, split seeds into separate files in the db/seeds/ directory:

# db/seeds/users.rb
10.times { User.create!(name: Faker::Name.name, email: Faker::Internet.email, password: 'password') } 
Enter fullscreen mode Exit fullscreen mode

Then load them inside db/seeds.rb:

Dir[Rails.root.join('db/seeds/*.rb')].sort.each { |file| load file } 
Enter fullscreen mode Exit fullscreen mode

5⃣ Seed Data Based on Environment

Use Rails.env to control when certain data is seeded:

if Rails.env.development?
  User.create!(name: 'Dev User', email: 'dev@example.com', password: 'password')
end 
Enter fullscreen mode Exit fullscreen mode

🔥 Pro Tip: Using Seedbank for Advanced Seeding

Seedbank allows better control of seeding by enabling namespaced seed files:

gem install seedbank 
Enter fullscreen mode Exit fullscreen mode

Instead of running rails db:seed, you can run:

dis rails db:seed:users 
Enter fullscreen mode Exit fullscreen mode

This executes only the users seed file, keeping things modular.


Need Expert Ruby on Rails Developers to Elevate Your Project?

Fill out our form! >>


Need Expert Ruby on Rails Developers to Elevate Your Project?


🎯 Final Thoughts

Seeding your database properly can make development and testing much smoother. By following best practices—keeping seeds idempotent, using tools like Faker and ActiveRecord-Import, and structuring your seeds logically—you ensure efficiency and maintainability.

Have any favorite seeding techniques? Let’s discuss in the comments! 🚀

Top comments (0)