5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

deviseの add_index :users, :email, unique: true 記述について

Last updated at Posted at 2021-02-11

なんでこの記事を書いたか

devise導入の際に生成されるマイグレーションファイルの下の方に
記述されている、

マイグレファイル
    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true

add_index :users, :email, unique: true
をemailカラムにデフォルトで設定されているunique制約だと思い込んでしまって泥沼にはまったため

元はといえば、メンターさんにunique制約書いた方がいいよと言われて
「えっ、でもdeviseって元からunique制約かかってるよな」と思ったのが混乱の始まり。
今思うとその時はテーブルの設計をしたREADMEファイルにunique制約書いとけよと言う意味だったが、
その時は分からず「マイグレーションにも書かなければいけないのか?」と思って大混乱

結論

add_index :users, :email, unique: true
この記述はデフォルトで設定されている、unique制約の記述ではない!! 
いやそんなのわかるよって人多そう(笑)

簡単に言うと

「前半のadd_index」は__『特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにする』__ための記述で
「後半のunique:true」はindexが使えるオプションとのこと

この時点でまだピンとこなかったのでさらに深堀、、、
完全理解するにはどうやら、__add_indexのindex__を理解をした方が良さそう

index とは

indexを張ることで特定のカラムからデータを取得したいときに、テーブルの中の特定のカラムのデータを複製して、検索が行いやすいようにする。
例えば多くのデータを格納しているカラムで検索したい値があるときに、カラムを複製してアルファベット順にして検索のしやすい環境を作る。

とりあえずどう言うときに使うかの認識としては、
『多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラム(unique制約のかかったカラムなど)の中で、検索がよく行われるカラム』
に対してadd_indexの記述を張ることで検索を簡単にしたいときに使う。

使い方としては
add_index :テーブル名, カラム名, 必要ならオプション名
と記述する

ここでやっとadd_index :users, :email, unique: trueこの記述
の意味を理解、、、、

ちなみにオプションはこんな感じ
:name - インデックスの名前
:unique - trueを指定するとユニークなインデックス
:length - インデックスに含まれるカラムの長さ


参考文献
https://qiita.com/seiya1121/items/fb074d727c6f40a55f22

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?