はじめに
学習過程において「一意」という日本語が「?」でした。この言葉と出会ったのがunique: true
というコードを知った時です。このコードは一体どのような意味なのか?追記することの利点は何なのか。調べたことをアウトプットしたいと思います。
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
unique: trueはどういうものか
unique: true
は、データベースのテーブルやフィールドに設定するオプションになります。このオプションを付けるメリットや特徴、例は以下の通りです。
【メリット・特徴】
重複値の防止: 同じ値が複数存在することを許さないから、データの整合性が保たれる。
検索性能の向上: ユニークな値が保証されることで、インデックスが効率的に利用される。
エラーの早期発見: 重複したデータを挿入しようとするとエラーが発生するため、早めに問題がわかる。
【簡単な例】
-
ユーザーのメールアドレス
email: { type: String, unique: true }
- 同じメールアドレスのユーザー登録を防ぐ。
-
商品コード
product_code: { type: String, unique: true }
- 同じ商品コードを持つ商品が存在しないようにする。
-
IDフィールド
user_id: { type: Number, unique: true }
- 各ユーザーに一意のIDを持たせ、重複を防ぐ。
-
投稿のタイトル
title: { type: String, unique: true }
- 同じタイトルの投稿が複数できないようにする。
-
ライセンスキー
license_key: { type: String, unique: true }
- 同じライセンスキーが複数のユーザーに割り当てられないようにする。
追記しない場合と追記する場合の違い
- 追記しない場合: 例えば、ユーザーのメールアドレスが重複して登録できてしまう。これにより、同じメールアドレスを持つ複数のアカウントが存在することになり、ログインや通知の際に混乱が生じる可能性がある
- 追記する場合: ユーザーが登録しようとした際に、既に存在するメールアドレスであればエラーが返され、登録が拒否される。これにより、データの整合性が保たれ、ユーザー体験も向上する
私が課題の中で遭遇したunique: trueについて
パスワードリセットに関する機能で、作成されたマイグレーションファイルのコードにはunique: true
が含まれていませんでした。
内容は、users テーブルに reset_password_token カラムのインデックスを追加するためのものですが、このままだと上記で説明したように他のユーザーが同じトークンを持つことになってしまいます
変更前
class SorceryResetPassword < ActiveRecord::Migration[7.1]
def change
add_column :users, :reset_password_token, :string, default: nil
add_column :users, :reset_password_token_expires_at, :datetime, default: nil
add_column :users, :reset_password_email_sent_at, :datetime, default: nil
add_column :users, :access_count_to_reset_password_page, :integer, default: 0
add_index :users, :reset_password_token
end
end
変更箇所
add_index :users, :reset_password_token, unique: true
- 一意のインデックスを追加することで、データの整合性が保証され、複数のユーザーが同じトークンを持つことによる混乱を防ぐことが可能となりました!
最後に
プログラミングを学習していく中で、コードの意味が分からなくてつまずくことはもちろんありますが、それ以前に日本語で躓いてしまうことがあるので、わからない今がチャンスと思い、すべて暗記は難しいですが、「確か、こんな意味だった・・・」レベルまでには到達したいもの。いや到達する!
今回の記事が何か参考になれば幸いです。