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.
Top comments (0)