Welcome to Week 3 of the COVIDiary project! If you’re just joining us or missed a post, here’s what we’ve done so far:
This week, our focus will be on the back end. All work will be completed in the COVIDiary-api repository. By the end of today, we will:
- Create our Rails API
- Initialize the PostgreSQL database
- Add User and Entry models
- Seed the database with dummy data
1. Create the Rails API
Because we are only using rails for the back end of our application, there are many unnecessary files included in the usual
rails new command. Fortunately, we can add the
--api flag to our command to reduce some of that bloat and properly configure our back end to cooperate with our React front end (more on that next week, hopefully). We will also add an additional flag,
--database=postgresql so our API knows we want to use PostgreSQL for our database.
In your terminal, make sure you are in the
/CD-api directory. Then, enter the following command:
rails new . --api --database=postgresql
It may take a few seconds, but you’ll soon see Rails automatically created a whole host of files for you. Time for a mini dance party!
2. Database Initialization
Now, let’s get our database up and running. This is an easy one. In your terminal, enter:
3. Add User Resource
Our database needs users. For the moment, we’re going to create a User resource with all the demographic information we want. When we set up authentication with Auth0 in a future post, we will have to tweak the User table slightly, but we’ll cross that bridge when we get there.
For now, run the following command:
rails g resource user
You should see something along these lines:
Now, open that
create_users migration file you just created (the first one in the screenshot). We’re going to add some information to our User table.
- Update 4.24.2020 - I changed the boolean name,
essential?to reflect best practices. You can see my explanation here. *
class CreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| # basic user info t.string :name t.string :email t.string :first_name t.string :last_name t.datetime :birth_date # info more specific to COVID-19 t.string :occupation t.boolean :is_essential t.datetime :isolation_start t.datetime :isolation_end t.text :about t.timestamps end end end
Once you’ve got all the table columns entered, run
rails db:migrate to add the User table to your database. You should see something like this:
4. Add Entry Resource
Next, we’ll repeat the process for our Entry resource. The Entry table will store all the diary entries created on our application. Each entry will belong to a specific User.
rails g resource entry user:references
user:references, Rails did some extra configuration for us. Your
models/entry.rb file should look like this:
class Entry < ApplicationRecord belongs_to :user end
We still need to add the corresponding
has_many association in the
models/user.rb file, like this:
class User < ApplicationRecord has_many :entries end
Now, let’s add some extra information to our
Update 4.24.2020 - I changed the boolean name,
symptoms_present? to reflect best practices. I also added the boolean,
is_public. You can see my explanation here.
class CreateEntries < ActiveRecord::Migration[6.0] def change create_table :entries do |t| t.references :user, null: false, foreign_key: true # user personal assessments t.integer :health_rating t.boolean :is_symptomatic t.text :health_comments t.integer :mental_health_rating t.text :mental_health_comments # actual diary entry t.text :diary_entry t.boolean :is_public, default: false t.timestamps end end end
Once that’s done, run
rails db:migrate again to add your Entry table to the database.
5. Seed the Database
Woo! We have a database! Unfortunately, it’s empty. Let’s fix that by seeding it with some dummy data. Note: these seeds are NOT for eating.
First, we need to add the Faker gem so we can easily populate the database with random information. Add
gem ‘faker’ to your Gemfile and run
bundle install in your terminal. Next, open up your
seeds.rb file. At the very top, we need to add
require ‘Faker’ so our new gem will work.
We are going to create 10 users with 3 entries each, using loops.
*Update 4.24.2020 - I updated the boolean names and added code for the
ispublic boolean. You can see my explanation here. *
# create 10 Users 10.times do user = User.create( email: Faker::Internet.safe_email, first_name: Faker::Name.first_name, last_name: Faker::Name.unique.last_name, birth_date: Faker::Date.between(from: 100.years.ago, to: Date.today), occupation: Faker::Job.title, is_essential: Faker::Boolean.boolean, isolation_start: Faker::Date.between(from: 3.months.ago, to: Date.today), about: Faker::Lorem.paragraphs(number: 2)) # create 3 diary Entries for user 3.times do Entry.create( health_rating: Faker::Number.between(from: 1, to: 5), is_symptomatic: Faker::Boolean.boolean, health_comments: Faker::Lorem.paragraphs(number: 1), mental_health_rating: Faker::Number.between(from: 1, to: 5), mental_health_comments: Faker::Lorem.paragraphs(number: 1), diary_entry: Faker::Lorem.paragraphs(number: 4), is_public: Faker::Boolean.boolean, user_id: user.id) end end
rails db:seed in your terminal! To check that it worked, open the Rails console using
rails c. You can see all the users in your database by entering
User.all. I just wanted to see the first user and its entries. Here’s my console:
Okay, friends, we’re making progress! Next week, we’ll delve into user authentication and HOPEFULLY start building the front end. I had to take care of some family things this week, so I didn’t have as much time as I’d have liked for our little project.
I will talk to you all soon. In the meantime, stay safe and healthy!