Kuni-Blog

Webエンジニア目指して勉強中/RUNTEQ 5月生/Ruby on Rails/沖縄出身/23歳

Rails: db:resetとdb:migrate:resetの違いについて

こんばんは、くになかです。

学習したことの備忘録を書いて行きたいと思います。

はじめに

テストを試してみたところ、以下のエラーが出たので、その解決方法を記載しています。  

Rails / UniqueValidationWithoutIndex 一意性の検証には一意のインデックスを使用する必要があります。 

解決方法

t.index [:user_id, :board_id], unique: true

以前、カラムに一意成約をつけるためにマイグレーションファイルに上記コードを追加しました。

それを反映させるために、rails db:resetをして再度rails db:migrateをしたのですが、変更されず一意性の検証エラーが出ました。

そのやり方は、適切ではなかったみたいです。

調べてみたところ、rails db:resetではマイグレーションファイルを編集していても、その内容は反映されないため、schema.rbは書き換わらないのです。

スキーマファイルを確認してみたところ、変更は適用されていませんでした。

t.index ["user_id", "board_id"], name: "index_bookmarks_on_user_id_and_board_id"

  正しくはdb:migrate:resetでした。

db:migrate:reset はマイグレーションファイルを直接利用します。つまり、マイグレーションファイルの変更が反映されます。

実行し、スキーマファイルを確認してみたところ、変更が適用されていました。

t.index ["user_id", "board_id"], name: "index_bookmarks_on_user_id_and_board_id", unique: true

参考文献

qiita.com

以上です。最後まで読んでいただきありがとうございます。