[Ruby] Rails Tutorial (4th Edition) Memo Chapter 6

3 minute read

Rails Tutorial (4th Edition) Personal Notes
Describe the part you are interested in and the part you may forget.

  • Ruby 2.6.1
  • Rails 5.1.6

You created the Users controller at the end of the previous chapter (5.4). The continuation.
From Chapter 6 to Chapter 12, we will create each function of user authentication.
Of these, Chapter 6 deals with the user’s data model and storage.

  • Apology
    I feel that it is different to post a memo that is not completely knowledgeable to Qiita,
    If you raise your impression as an article, there was a certain reaction and it was also a learning experience, so it will be a mess, but please forgive me.
    And although I haven’t written Rails recently, the draft has been filled up, so I released it.

Chapter 6 Creating a User Model

Rails already has a mechanism for implementing authentication, but each service requires a lot of custom authentication.
This is a reinvention of the wheel, but the Rails tutorial reinvents the wheel because it’s easier to implement third-party certification if you know how to do it.

6.1 User model

Rails calls the default data structure that treats it as a data model Model (M in MVC).
Rails defaults to ʻActive Record` to interact with this Model.
This is something that does CRUD and construction without being aware of SQL.

6.1.1 Database migration

Create a User model to persist the database.
Just like when creating the Users controller, $ rails g.

As a reminder
The controller is ** plural ** ʻUsers The model is ** singular ** ʻUser

It is customary to say.

$ rails g model User name:string email:string

Pass the attribute used in DB (column name in DB) and the type with : in between.

Although various files are generated, a file named timestamp_create_model name s.rb is created in db / migrate / .
Information for creating a DB is defined here.

db/migrate/Time stamp_create_users.rb


class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

The id and time stamp are automatically prepared even if you do not specify them.
Looking at the class name part, it seems that it inherits ʻActiveRecord :: Migration [5.0]. (5.0 in Rails tutorial, but 5.1 notation for my environment) timestamps creates two columns for timestamps [ created_at, ʻupdated_at].

Is it like this with mysql?

mysql


CREATE DATABASE User;
USE Users;
CREATE TABLE users(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(300),
  email VARCHAR(300),
  created_at TIMESTAMP NOT NULL CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
);

Every time I write sql, I’m writing that an uncle who doesn’t allow uppercase or lowercase letters is likely to occur (I was also in my previous job).
To be honest, I think it’s okay to use all lowercase letters in this age.
~~ By the way, in my previous job, write the date in varchar () and stop doing crap ~~

Apply migration.
According to a friend, I was reminded that it was a command to explode with special care in multi-person development. Let’s be careful.
The DB side is not version controlled.

$ rails db:migrate

6.1.2 model file

** Exercise **
I did ʻUser.new` in the Rails console and checked what kind of inheritance relationship it has.

ʻUser class <ʻApplicationRecord <ʻActiveRecord :: Base <ʻObject <BaseObject

6.1.3 Create a user object

rails console sandbox options

Will roll back all changes to the DB at the end.

$ rails console --sandbox

Experiment in this.
The user class was created when the model was created (ʻapp / model / ), which is inherited from ʻActiveRecord.

Method used below
valid?: Confirmation of validity (Validity)
save: Save
When saved, a time stamp is stamped on create_at, ʻupdate_at`.
In the return value, the bool value of whether or not it was saved is returned.

create: User.new only creates it in memory, but saves it as soon as it is created.

** Exercise **
User.create
user.name
ActiceSupport::timeWithZone

6.2 Validate users

6.2.1 Validate

In short, it’s like specifying a column type in SQL.
For : email, Double or Boolean is not included.
The following 4 points

–Presence
–Length
–Format
–Uniqueness

Impressions

–I feel like I need a delete flag in the users table. Will you add it later?
――It’s easy to do the migrate file of db, id to write all the time, and you don’t have to specify the number of characters with varchar.
–I am very relieved that the migrate file of db and the changes will remain in chronological order. In my previous job, I didn’t even leave the SQL when I changed the DB.