なんでバリデーションかかってないの!?(unique:true編)


いやーね。
私本当にびっくらこきましたよ。
今ねrails5.2でフリマアプリ実装中なんですよ。
バリデーションみんなかけるよね?
うんわかってるよ。
みんなアタイとおんなじ気持ちだよね。
アタイわかってる。
まずね。
バリデーションはモデルとマイグレーションファイルどっちにも書いた方が良いみたいなんだけど、
今回はマイグレーションファイルの方に関してだから、モデルの方のバリデーションに関しては他の方の記事を参考にすると良いわ。

1.最初に見て欲しいのはコレっ!

db/migrate/create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :first_name,         null:false ,unique: true
      t.string :last_name,          null:false ,unique: true
}

こんな感じでね。
さーいくわよ!

2.レッツ

コンソール
 rails db:migrate

そしたらさ。

db/migrate/schema.rb
 create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "first_name", null: false
    t.string "last_name", null: false
}

ズゴーーーーーーーー!!


null:falseはバリデーションかかってるのに、unique:trueかかってないっての!!!
なんでよ。。。アタイこんなエラーカリキュラムで習ってないわよ。
あーもうしんどいジャパン。

そんな時はこれ!!

mysqlの方を見に行っちゃおうってわけ。

※今日はちょっとめんどくさがっちゃうから省略するわ。

要するにDBの方にもバリデーションかかってないのよ。

もうしんどいアメリカ!!!
もう調べてやるわ。。。

3・・・・・数分後・・・・・・・

アタイこんなの見つけたわ。

Railsドキュメント

それによると。。。

 add_index :users, [:name], unique: true

本当かよ!!!初耳なんですけど!
え!?初耳なんですけど!!

信じてないよ?え?信じてないよ?
そんな簡単に上手くいくわけないじゃない

db/migrate/schema.rb
 create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
  t.string "first_name", null: false
  t.string "last_name", null: false
  t.index ["first_name"], name: "index_users_on_first_name", unique: true
  t.index ["last_name"], name: "index_users_on_last_name", unique: true
}

いやホンマやないかい!!!


そんなことありえるんですね。
皆さんに僕と同じ状況になる人がいるのかわかりませんが、参考になりますyouに!!!

ではまた。