なんでこの記事を書いたか
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 - インデックスに含まれるカラムの長さ