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用に更新することになるかなと考えています。