How-To: Using the Faker Gem to Seed your Rails Database
Tags: rails, ruby, database
Published: 2020-09-08 23:15:31

# 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](https://github.com/faker-ruby/faker) 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](https://github.com/faker-ruby/faker) 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](https://dev.to/akabiru/look-up-faker-methods-on-your-terminal-2p7f) 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: 
```ruby
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:
```ruby
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: 
```ruby
[#<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:

```ruby
[#<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](https://github.com/faker-ruby/faker#ensuring-unique-values) 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.