Construction report: we create tables for trainers and trainees
Tags: rails
Published: 2021-04-22 17:19:02

Third post and 5 followers, please contact with collaboration proposals for influencers on priv.

Today a continuation of an earlier post, we will add a model and database tables for trainer and trainees. The assumption is that these two roles will have separate tables, where after registration a new record will be added with a foreign key referring to the users table. 

Here we go!
The console our best friend, so we type:

`rails g model trainer`

which generates two files containing the model and the migration with the new table. We are going to edit the migration file, which is similarly named: *20210425185512_create_trainers.rb*

```ruby
class CreateTrainers < ActiveRecord::Migration[6.1]
  def change
    create_table :trainers do |t|
      t.references :user, index: true, foreign_key: true
      t.string :description
      t.timestamps
    end
  end
end
```

A few words about what magic has just happened here. The first field is actually a foreign key to the users table. We are extending this table in a 1:1 relation. Then we have a text field in which the trainer can describe their activity. Timestamp is generated by default by rails CLI. Amazing, isn't it?

We already have trainers, we can slowly think about a marketing campaign. Now it is time for the trainees. The wonders that happen here will stay in your memory for a long time. Of course, the console:

`rails g model trainee`

Open the migration file *(20210425185842_create_trainees.rb)* and write:

```ruby
class CreateTrainees < ActiveRecord::Migration[6.1]
  def change
    create_table :trainees do |t|
      t.references :user, index: true, foreign_key: true
      t.references :trainer, index: false, foreign_key: true
      t.integer :weight
      t.integer :height
      t.date :date_of_birth
      t.timestamps
    end
  end
end
```

Here we are already rubbing up against machine learning, artificial intelligence and interplanetary expeditions. A brief explanation so as not to get lost. The first item, as with the coach, is a reference to the user table. Next we have references, this time to the trainers array, with which we have a many-to-one relation - one trainee has one coach, but one trainer has many trainees. Then we have two fields with weight and height and another one with date of birth.

We have the migrations ready. Let's launch the rocket! In the console:

`rake db:migrate`

And it's done!
We will expand these tables later, but for now we want to run applications with basic functionality. Let's now move on to editing models. First up for editing is the trainer model, which for now will look more or less like this:

```ruby
class Trainer < ApplicationRecord
  belongs_to :user

  has_many :trainees
end
```

In a nutshell, this class is just indicating to our application the relationship between the tables. We have almost the same thing in the trainee model:

```ruby
class Trainee < ApplicationRecord
  belongs_to :user
  has_one :trainer
end
```

With little difference in the relation. The trainee has one trainer.

And what's in the next episode? We will create a login and registration form. Stay tuned!

Cover photo: Luna is crazy today and took my flip-flop!