LoginSignup
12
9

More than 3 years have passed since last update.

【Rails】マイグレーション up,downをchangeと比較して理解する

Last updated at Posted at 2021-01-14

記事の対象者

・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速習実践ガイド」

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9