【パーフェクト Ruby on Rails】を読む - その16

3-3-2 テーブルの定義を反映させる

マイグレーションファイル内ではデフォルトではchangeメソッドが使用されています。 bin/rails db:migrateを実行したら、upになり、bin/rails db:rollbackを行うとdownになります。
remove_columnはupになる事でテーブルが削除されるもので、普段通りにコードを書くと、rollbackで削除されたものを復元できませんが、Railsガイドにこのような記述がありました。

remove_columnは、3番目の引数でカラムの型を指定すればロールバック可能になります。元々のカラムオプションも指定しておかないと、ロールバック時にRailsがカラムを再作成できなくなります。

remove_column :posts, :slug, :string, null: false, default: ''  

この例でいうと、:stringが該当します。カラムの型は文字列だと指定することで、rollbackによる復元が可能になります。

bin/rails db:rollbackの挙動についてあやふやだったので調べました

% rails db:rollback コマンドを使うと、% rails db:migrateしてup状態の1個前のマイグレーションファイルをdownにしてくれます。2個前ならSTEP=2というオプションを付与します。

upメソッドとdownメソッドについて

正直、changeメソッド以外のupメソッドの時とdownメソッドの時でマイグレーションの中の挙動を変えるのを書く場合に遭遇した事がないので、使う時にはまた読み返したいと思いました。

データベース周りの全体像がイメージできていなかったので調べました

画像引用
とてもわかりやすい図をありがとうございます。

  • DBをCREATEした時にデータベースに情報を入れるには、1回目の作成時にはschemaファイルはないのでマイグレーションファイルから取り込む必要があります。
  • 作成したマイグレーションファイルをrails db:migrateするとdb:schema:dumpも実行されschema.rbが出来上がります。
  • rails db:schema:loadを使うとき
    • 例えば、一度 何かしらで DBが空で、schema.rbが残っている状態でrails db:createをして空のDBを作成後、データを入れるときにマイグレーションファイルから読み込むときよりも、 rails db:schema:loadスキーマファイルを読み込む方が、高速かつエラーが起きにくい傾向があります。Railsガイド

個人的に興味深かったところ

rails db:migrateとrails db:rollbackを行うと同時にrails db:schemaも実行されているから、schema.rbの内容が書き変わるというところが、点と点が線になった感覚がありました。
(´・ω・`) (´-ω-`)

参照

bin/rails db:rollbackの挙動
schema.rbとmigrationファイルの関係をまとめてみたよ