loading...
Cover image for How-To: Using the Faker Gem to Seed your Rails Database

How-To: Using the Faker Gem to Seed your Rails Database

boyloe profile image Bryan Oyloe ・5 min read

Introduction

Faker is a ruby gem that gives you random data in many different categories that can easily generate database seeds for use in your rails applications. Say you are building an app that tracks the Pokemon that a trainer has captured. In order to test your database, you would need to seed it with some Pokemon and trainers. Using Faker gem you can generate random trainers with names and ages, as well as randomly produce the Pokemon that will seed your database using the names and attributes of the actual Pokemon from the game. No need to program each one in yourself!

How to Use

Installation

Installation of the faker gem is very straightforward. The Faker README is very detailed and provides a great deal of information. To install the faker gem simply type gem install faker in your terminal. After the gem installation is complete, open your rails app and go to your seeds file to begin using Faker. How you utilize the gem depends on the type of data you will be looking for. The README lists all of the different classes that Faker supports, such as Name, Address, Artist etc.
If you prefer to display the list of methods straight from your terminal, there is another gem called faker-bot that can be installed. This guide can walk you through the install process easily.

Application

I started using the Faker gem during a weekend "build and burn" Rails app session with 3 of my class mates at Flatiron School. We were practicing making a one:many relationship and had decided on a players to sports teams model. Here is how our database was set up:

ActiveRecord::Schema.define(version: 2020_08_30_213624) do

  create_table "players", force: :cascade do |t|
    t.string "name"
    t.integer "number"
    t.integer "team_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["team_id"], name: "index_players_on_team_id"
  end

  create_table "teams", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  add_foreign_key "players", "teams"
end

Rather than tediously typing out a bunch of different player's names and numbers, creating a bunch of team's names to assign to the players , I used the Faker gem to do the work for us. Faker::Sports::Basketball allowed us to automatically populate our seed data like so:

Player.destroy_all
Team.destroy_all

5.times do 
    Team.create(name:Faker::Sports::Basketball.team)
end

teams = Team.all 

10.times do 
    Player.create(name: Faker::Sports::Basketball.player, 
                  number: rand(1..99),  
                  team: teams[rand(0..4)])
end

In the Team.create we used the Basketball.team method to randomly generate an actual NBA team using data from Faker. We then populated the array teams by calling Team.all.

Once the teams were created, we used Basketball.player to generate a random, actual NBA player's name. We then randomly assign them a jersey number, and a team by calling team:teams[rand(0..4)]. After running rails db:seed we get a teams table that looks like this:

[#<Team:0x00007fef603eaf88
  id: 12,
  name: "Chicago Bulls",
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Team:0x00007fef5ca7aa28
  id: 13,
  name: "Golden State Warriors",
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Team:0x00007fef5ca7a0f0
  id: 14,
  name: "Toronto Raptors",
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Team:0x00007fef5ca79fb0
  id: 15,
  name: "Memphis Grizzlies",
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Team:0x00007fef5ca79cb8
  id: 16,
  name: "Los Angeles Clippers",
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>]

and we get a players table with this data:

[#<Player:0x00007fef604c3748
  id: 12,
  name: "Kevin Durant",
  number: 99,
  team_id: 16,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
#<Player:0x00007fef60501d68
  id: 13,
  name: "Stephen Curry",
  number: 14,
  team_id: 13,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef60501c78
  id: 14,
  name: "Kyrie Irving",
  number: 41,
  team_id: 13,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef60501bb0
  id: 15,
  name: "LeBron James",
  number: 26,
  team_id: 12,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef60501a70
  id: 16,
  name: "Anthony Davis",
  number: 76,
  team_id: 12,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef60501908
  id: 17,
  name: "Nikola Jokić",
  number: 35,
  team_id: 15,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef605017f0
  id: 18,
  name: "Kyle Lowry",
  number: 92,
  team_id: 16,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef60501700
  id: 19,
  name: "Dirk Nowitzki",
  number: 31,
  team_id: 16,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef60501638
  id: 20,
  name: "Russell Westbrook",
  number: 84,
  team_id: 14,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>,
 #<Player:0x00007fef605014a8
  id: 21,
  name: "Karl-Anthony Towns",
  number: 83,
  team_id: 15,
  created_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00,
  updated_at: Fri, 04 Sep 2020 22:30:41 UTC +00:00>]

Using this method, we were able to generate 5 teams and 10 players assigned to those teams in a few simple lines of code, instead of typing out each team and player by hand.

Conclusion

One caveat to be aware of, the Faker gem generates random data but doesn't guarantee uniqueness. If your data seeds require uniqueness, check this out for more direction.

Faker is a cool and fast way to generate bulk data quickly for your Rails app seeds. Hope this helped you learn more about it. Thank you for reading.

Posted on by:

boyloe profile

Bryan Oyloe

@boyloe

A Full-Stack Software Engineering student at Flatiron School-Denver

Discussion

markdown guide