##記事の対象者
・Railsのマイグレーションにおけるchangeメソッドは知っているが、up,downメソッドが出てきて違いがよくわからない初学者
・マイグレーションを追加して、適用(マイグレファイル作成、rails db:migrate)はしたことがあるが、適用の取り消しをしたことがない方
※Railsガイド、書籍「現場で使えるRuby on Rails5速習実践ガイド」を基に解釈して書いております。
解釈が間違っていたら、指摘頂ければ幸いです。(もしくは、書籍やRailsガイドを参照下さい。)
##前提知識(マイグレーションは、適用だけでなく適用を取り消せるよ)
マイグレーションにおいては、1つのマイグレーション(ファイル)が1つのバージョンとして扱われます。つまるところ、1つのマイグレーションを適用することでデータベースのバージョンを1つあげることができ、適用済のマイグレーションを1つ取り消すことでバージョンを1つ下げることができる。
→バージョンの上げ下げ(適用、適用を取り消す)を意識できていないとup,downメソッドが理解できません!!
##changeメソッドについて(自動で適用を取り消す処理をしてくれるよ)
以下のようにマイグレーションファイルでは、changeというメソッドの中でtasksテーブルを作成しています。
一見すると、バージョンをあげる(テーブルを作成する)時のコードだけが書かれているように見えますが、実はバージョンを下げる(テーブルを削除する)処理も適切に行なってくれます。
class CreateTasks < ActiveRecord::Migration[5.2]
def change
create_table :tasks do |t|
t.string :name
t.text :description
t.timestamps
end
end
end
##changeでサポートされているマイグレーション定義(これらならchangeの中で使えるよ)
以下は、Railsガイドに掲載されているです。
(上記の例で挙げたcreate_tableは、一覧に入っているのでchangeメソッドを利用します。)
add_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default (:fromと:toの指定は省略できない)
change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table (ブロックを渡さなければならない)
enable_extension
remove_column(型を指定しなければならない)
remove_foreign_key(2番目のテーブルを指定しなければならない)
remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_table
#up,downについて(自動で適用を取り消す処理をしてくれないよ)
上記、changeでサポートされているマイグレーション定義以外のもの(以下の例だと「change_column」)については、自動でバージョンを下げる(テーブルを削除する)処理を行ってくれないので、upでバージョンをあげる処理に加え、downでバージョンを下げる処理を記述する必要があります。
class ChangeTasksNameLimit30 < ActiveRecord::Migration[5.2]
def up
change_column :tasks, :name, :string, limit: 30
end
def down
change_column :tasks, :name, :string
end
end
もし、上記のdownの部分を書かずに、バージョンを下げようと適用済のマイグレーションを取り消そうとする場合、automatically reversible(自動的に戻せない)であるという例外が発生します。
##まとめ
changeがサポートしているマイグレーション定義なら、バージョンを下げる記述をしなくてもバージョンを下げられる。
changeがサポートしてないマイグレーション定義(上の例だとchange_column)で記述する場合は、downを書かないとバージョンを下げられない。
また、この記事で雰囲気がわかったら、Railsガイドの固めの表現も理解できると思います。
##参考
・Railsガイド
https://railsguides.jp/active_record_migrations.html#up-down%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86
・書籍「現場で使えるRuby on Rails5速習実践ガイド」