pockestrap

Programmer's memo

Railsのマイグレーション生成をもっともっとImprovementする! mi gem version 1.0.0 をリリースしました!

こんにちは! RuboCop大好きpockeです。 最近はRuboCopにPRを投げるのが趣味みたいになってきました。

Railsにおけるマイグレーションファイルの生成をもっともっと楽にするGem、miのバージョン1.0.0をリリースしたので、今回はその紹介をしようと思います!

github.com

はじめに

唐突ですが、rails g migrationってめんどくさいですよね。私は死ぬほどめんどくさいと思っています。
今回紹介するmiはこのコマンドをより楽にするGemです。 どれぐらい楽になるのか比較してみましょう。

# 従来のもの
$ bin/rails g migration AddEmailToUsers email:string

# mi を使用したもの
$ bin/rails g mi users +email:string

上記の2つのコマンドは、どちらも同じマイグレーションファイルを生成します。

miの方がより簡潔な記述になっていますね。

思想

私はこのmiで重要な点は、クラス名を直接記述しなくて済むことだと考えています。

従来のジェネレータでは、AddEmailToUsersの様にユーザーが明示的にクラス名を指定する必要があります。
しかし先ほど見ていただいたとおり、miではクラス名を指定していません。 miではmiがクラス名を生成します!

これによって、クラス名の命名規則を覚える必要がなくなり、無駄なタイプ数も削減されます。

使い方

miでは、+add_column, -remove_column, %change_columnを表します。 実例を見るのがわかりやすいので実際に見てみましょう。

$ bin/rails g mi users +age:integer -name %email:string:{null:false}
      create  db/migrate/20160709082050_add_age_and_remove_name_and_change_email_of_users.rb

上記のコマンドを実行すると、以下のようなマイグレーションファイルが生成されます。

class AddAgeAndRemoveNameAndChangeEmailOfUsers < ActiveRecord::Migration
  def change
    add_column :users, :age, :integer
    remove_column :users, :name
    change_column :users, :email, :string, null: false
  end
end

簡潔で直感的な出力結果ですね!

もっともっと便利に!

ここまでの例は既存のテーブルに対しての操作でしたが、バージョン1.0.0からはcreate_tableもサポートしています。

$ bin/rails g mi:create users +email:string +name:string
      create  db/migrate/20160709082602_create_users_table.rb
class CreateUsersTable < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email
      t.string :name

      t.timestamps null: false
    end
  end
end

より多くの場面でmiをお使いいただけるようになりました。

そしてRails 5へ

先日Rails 5がリリースされましたね!

Riding Rails: Rails 5.0: Action Cable, API mode, and so much more

ActionCableが目玉機能として注目されていますが、マイグレーションファイルにも変更が入っています。

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.

New migrations specify the Rails version they were written for:

class AddStatusToOrders < ActiveRecord::Migration[5.0]
  def change
    # ...
  end
end

Matthew Draper, Ravil Bayramgalin

rails/CHANGELOG.md at v5.0.0 · rails/rails

上記の通り、既存のマイグレーションが壊れるのを防ぐためにマイグレーションのバージョニング機能が入っています。

miもバージョン1.0.0でこの機能に対応しました!
Rails 5を使用していれば、上記のフォーマットに沿ったマイグレーションファイルが生成されます。
また、もちろんRails 4でも今までどおりお使いいただくことが可能です。

まとめ

miの説明をさせていただきましたが、いかがでしたでしょうか?

miが提供するものは、簡潔なマイグレーションファイルジェネレータのみです。
そのため、既存のジェネレータ(rails g migration)と併用することも可能であり、生成されたマイグレーションファイルは何ら特殊なものではないためmiにロックインされることもありません。
ですので既存の環境を壊すことなく導入が可能です。

Gemfileにgem 'mi'と書くだけで導入できるので、是非インストールして使ってみて下さい!

Link