マイグレーション実行時に用いるupとdownメソッド

こんにちは!kossyです!




気になったニュースはこちら
headlines.yahoo.co.jp

運営チームのガイドライン違反かどうかの確認がとても大変な気もしますが、
どのようにこの仕組みを回すのか気になります。

pythonと画像認識のライブラリを使って実装するのでしょうか。
画像認識や機械学習は手をつけていない範囲なので、
基礎教養として体系的な知識は身につけておきたいところです。












さて、今回はup,downメソッドの役割についてブログに残してみたいと思います。

環境
Rails5.1.6
Ruby2.5.1
MacOS





Railsマイグレーションを実行する際に登場するメソッドになります。
Railsにはrails db:rollbackというありがたいコマンドがあり、
これを実行するとマイグレーションをひとつ前の状態に戻してくれます。

ここでupとdownが登場するのですが、
up,downメソッドとchangeメソッドで挙動が異なります。

up,downの場合
upとdownメソッドは、rails db:migrateの実行時と、rails db:rollbackの実行時の処理を定義します。

class ChangeColumnToReview < ActiveRecord::Migration [5.0]
  def up
    add_column :review, :content, :string
  end

  def down
    remove_column :review, :content
  end
end

upメソッドで変更したものは、downメソッドで元に戻るようにしておかないと、正しくrails db:rollbackできません。







changeの場合

changeメソッドの場合は、rails db:migrate実行時の処理を記述します。
up、downメソッドの挙動と異なる点は、rails db:rollbackの処理を記述しなくても、
反転した処理を自動で行ってくれる点にあります。

class AddColumnToReview < ActiveRecord::Migration [5.0]
  def change
    add_column :review, :content, :string
  end
end

rollback時の処理も行ってくれるchangeメソッドですが、
全てのケースにおいて使えるわけではありません。






up.downメソッドのユースケース
例えば、以下のマイグレーションファイルをrails db:rollbackしようとすると、失敗します。

class RemoveColumnToReview < ActiveRecord::Migration [5.0]
  def change
    remove_column :review, :content
  end
end

contentカラムの情報がどこにも書いていないからです。
カラムの型情報も存在しないため、カラムの作成ができません。

こういった場合に、up,downメソッドを使用します。

class ChangeColumnToReview < ActiveRecord::Migration [5.0]
  def up
    remove_column :review, :content
  end

  def down
    add_column :review, :content, :string
  end
end