本記事はRailsチュートリアル6.2.5の備忘録です。
URL:https://railstutorial.jp/chapters/modeling_users?version=5.0#sec-uniqueness_validation
内容としては、ユーザ(Userクラス)のメールアドレス(email)を一意なものとして定義し、そのテストをしていくというものです。
アプリ側(モデル)とDB側の両方で、一意性を設定することができますが、結論から言うとどちらも設定する方が良いようです。
それでは詳細に説明していきます。
アプリ側では、以下のように一意性を持たせることができます。
class User < ApplicationRecord
…
validates :email, presence: true, length: { maximum: 255 },
format: { with: /正規表現/ },
uniqueness: true #####追記#####
end
ただ「Active Recordはデータベースのレベルでは一意性を保証していない(Railsチュートリアルより引用)」とのことです。
例えば、山田太郎さんがユーザ登録する際、登録ボタンを誤って二回連続で押してしまったとします。(手が震えてカチカチってなることたまーにありますよね)
このケースだと、DB内で同じメールアドレスが重複して登録されてしまいます。
そのため、DB側にも一意性を持たせて万全に備えようというわけです。
DB側にはインデックスを追加することで一意性を持たせます。
まずはマイグレーション作成
$ rails generate migration (任意の名前)
上記のマイグレーションを編集
class (クラス名) < ActiveRecord::Migration[5.0]
###ここから追記###
def change
add_index :users, :email, unique: true
end
###ここまで###
end
最後にマイグレートして上記の変更を反映させます。
$ rails db:migrate