細かきこと

書いたり書かなかったり

migrationのchangeの話

久しぶりにrailsで開発することになって、久しぶりに「rails g model hoge」 をしたら、upじゃなくてchangeを実装するようになっていた。

でも、今まで通り、upも使える。

changeの中でcreate_tableを実行するように書くと、「rake db:rollback」でdownでdrop_tableを書かなくてもdropしてくれる。

upのときにテーブルやカラムにコメントを設定するようなsqlを実行したい場合changeでどうやるかというと、「reversible」を使うとよい。

def change
  create_table :hoges do |t|
    t.string :name, null: false
    t.references :foos
  end
  reversible do |rv|
    rv.up do 
      execute <<-SQL
        comment on table hoges is 'ほげ';
        comment on table hoges.name is '名前';
      SQL
    end
    rv.down do
      # down 時に流したいSQLをながす
      execute <<-SQL
         ...
      SQL
    end
      add_column ...
      rename_column ...
  end
end

reversibleに渡すブロックの中で、add_column,rename_columnを実行するように書くとup/downでスムーズに処理されるようになる。

詳しくは、本家で。

http://guides.rubyonrails.org/migrations.html