xengineer’s diary

結果、メモ的な内容になっています。

railsでmigration scriptを生成する

何度やっても覚えないのでメモ・・・

$ rails generate migration <class name>

class nameのところは、実際にそのスクリプトで何をやるかが
明確にわかるようにかーく。

例えば、今生成するのは、organization テーブルに、inquiry カラムを追加するので、

$ rails generate migration AddInquiryToOrganizations

ってしとけばいい。
そうすると、

db/migrate/20141019xxxxxx_add_inquiry_to_organizations.rb

的なファイルができる。
ファイル自体は中身がないテンプレなので、こんな感じに書いておく。

class AddDescriptionToOrganizations < ActiveRecord::Migration
  def change
    add_column :organizations, :description, :text
  end
end

add_columnは、rollbackのクエリを、railsが作ってくれるので、
rollbackを気にしなくていいけど、全部のメソッドに対応してるわけではないぽい。

下記のブログに書いてあったので、
Rails3.1ではchange_tableメソッドでマイグレーションするとロールバックできない - give IT a try
ruby on rails - why IrreversibleMigration occurs? - Stack Overflow

4.1stableのsourceみてみました。
rails/command_recorder.rb at 4-1-stable · rails/rails · GitHub

    # <tt>ActiveRecord::Migration::CommandRecorder</tt> records commands done during
    # a migration and knows how to reverse those commands. The CommandRecorder
    # knows how to invert the following commands:
    #
    # * add_column
    # * add_index
    # * add_timestamps
    # * create_table
    # * create_join_table
    # * remove_timestamps
    # * rename_column
    # * rename_index
    # * rename_table

は対応してるそうですよ。

ということで、次回忘れたらここを参照しよう。