kouの技術的メモ

学習した内容の定着やアウトプット用に開設しました

成果物の作成4 Userモデルの作成

ログイン機能や、投稿者にユーザ名を表示するのに使います。

とりあえず制作するUserモデル

ID name email created_at updated_at password_digest
1 hoge foo@.bar.com 作成日時 更新日時 暗号化パスワード

後々付け足していきます。

emailに関しては一意性を確保したいので、 バリデーションに uniquenessを追加します。

urer.rb

class User < ApplicationRecord
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }                    #大文字小文字区別なく、重複を防ぐ
end

ただ、これだけだとデータベースレベルでは一意性を保証できず、サーバが激しいトラフィックにさらされたり、

ユーザーが素早く複数回登録ボタンを押してしまうと、稀に同じデータが登録されてしまいます。

これを防ぐためにはデータベースのemail属性にインデックスを張り、重複を防ぎます。(インデックスは、列値の一意性を強制する効果もある)

なので新しくマイグレーションファイルを作成し、インデックスを追加します。

class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
  def change
    add_index :users, :email, unique: true   #インデックスの追加
  end
end

また、平文でデータベースにパスワードを入れるのは危険なので、password_digestカラムを作成し、そこにハッシュ化されたパスワードを保存できるようにします。