LoginSignup
0
1

More than 1 year has passed since last update.

【Rails】DBの一意性について【備忘録】

Posted at

本記事は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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1