Rails Migration versioningと5.1での変更点

Rails 5.0で導入されたMigration versioningでは、Migrationを作成する際にSuperClassにバージョンを指定することで挙動をコントロールできるようになりました。

Version the API presented to migration classes, so we can change parameter defaults without breaking existing migrations, or forcing them to be rewritten through a deprecation cycle.

http://guides.rubyonrails.org/5_0_release_notes.html

例えばRails5.0でModelを生成するとこんな感じにMigrationが生成されます。

class CreateHoges < ActiveRecord::Migration[5.0]
  def change
    create_table :hoges do |t| 
                                                                                                                                                                                  
      t.timestamps
    end 
  end 
end

4.2と5.0の挙動の変更点は下記サイトを参考にする限りtimestampsのnot_nullがデフォルトになったことと、外部キーのindex:trueがデフォルトになったようです。
http://blog.bigbinary.com/2016/03/01/migrations-are-versioned-in-rails-5.html

ただ、Rails5.1でより多くの動作の変更がありました。

バージョン指定が必須

Rails5.1でSuperClassへのバージョン指定が必須となりました。指定しない場合例外が発生します。

Inheriting directly from ActiveRecord::Migration raises an error. Specify the Rails version for which the migration was written for.

http://guides.rubyonrails.org/5_1_release_notes.html

主キーのデフォルトがBIGINT

主キーのデフォルトがBIGINTに変更になりました。

Change Default Primary Keys to BIGINT.

http://guides.rubyonrails.org/5_1_release_notes.html

これまで、BIGINTを使用する場合には指定する必要がありましたが、5.1では逆にINTを使用したい場合は指定が必要になります。

ここで、バージョン指定が挙動に関係してきます。4.2や5.0のMigrationでは指定しないとINTになるが、5.1ではBIGINTになるので同じアプリケーションの中に混在すると紛らわしいと感じました。

5.1仕様に書き直す方が記述内容が減るのでバージョン記載する5.1用に更新することになるかなと考えています。

改訂2版 パーフェクトRuby

改訂2版 パーフェクトRuby