Step 3: Belongs To

View the Diff

We’ll be adding the database table departments:

id name
1 Engineering
2 Safety
3 QA

We’ll also be adding a department_id:integer foreign key column to the positions table.

The Rails Stuff 🚂

Generate the Department model:

$ bin/rails g model Department name:string

To add the foreign key to positions:

$ bin/rails g migration add_department_id_to_positions
class AddDepartmentIdToPositions < ActiveRecord::Migration[5.2]
  def change
    add_foreign_key :positions, :departments
  end
end

Update the database:

$ bin/rails db:migrate

Update our seed file:

[Employee, Position, Department].each(&:delete_all)

engineering = Department.create! name: 'Engineering'
safety = Department.create! name: 'Safety'
qa = Department.create! name: 'QA'
departments = [engineering, safety, qa]

100.times do
  employee = Employee.create! first_name: Faker::Name.first_name,
    last_name: Faker::Name.last_name,
    age: rand(20..80)

  (1..2).each do |i|
    employee.positions.create! title: Faker::Job.title,
      historical_index: i,
      active: i == 1,
      department: departments.sample
  end
end

Make sure to update spec/factories/departments.rb with randomized data. Then, since this is also a required relationship, update spec/factories/positions.rb to always seed a department when we ask to create a position:

factory :position do
  employee
  department

  # ... code ...
end

The Graphiti Stuff 🎨

You should be used to this by now:

bin/rails g graphiti:resource Department name:string

Add the association:

# app/resources/position_resource.rb
belongs_to :department

And review the end of Step 2 to get all your specs passing (add the department to the request payload). Practice makes perfect!

Digging Deeper 🧐

Note that we didn’t need a filter like we did in step two. That’s because the primary key connecting the Resources is id by default. In other words, the Link would be something like:

/departments?filter[id]=1

Which we get out-of-the-📦

But remember, you can customize these relationships just like the previous has_many section.