rails generateコマンドでマイグレーションファイルを生成しました。

railsのgenerateコマンドでマイグレーションをファイルを作成したので、記法などについてまとめておきます。

# generateコマンドの基本
rails generateコマンドで命令する基本構文は以下になります。

```bash:generateコマンドの基本
rails generate 命令
rails g 命令
```
**generate** でも **g** でも動作するので短くてすむ **g** を使うようです。

# generate scaffold でコントローラ、モデル、ビューを生成する
コントローラやモデル、ビューをすべて生成する場合はScaffoldを利用します。

```bash:Scaffold生成の基本
rails g scaffold モデル名
```
EventモデルをScaffoldする例

```bash:EventモデルをScaffold
bundle exec rails g scaffold Event
```
上記のように`generate scaffold` では、eventのコントローラとモデルとビューを生成します。
コントローラやモデルなどを一部だけ生成したい場合は、下記のようにscaffoldの前に指定をします。

```bash:Scaffold生成の基本
rails g controller scaffold モデル名
```
こちらではcontroller周りのファイルだけが生成されます。

# generate controller でコントローラを生成する
コントローラ生成の基本構文はgenerateにcontrollerを指定します。

```bash:コントローラ生成の基本
rails g controller コントローラ名
```
eventsコントローラを生成する例です。

```bash:eventsコントローラを生成
bundle exec rails g controller events
      create  app/controllers/events_controller.rb
      invoke  erb
      create    app/views/events
      invoke  rspec
      create    spec/controllers/events_controller_spec.rb
      invoke  helper
      create    app/helpers/events_helper.rb
      invoke    rspec
      create      spec/helpers/events_helper_spec.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/events.coffee
      invoke    scss
      create      app/assets/stylesheets/events.scss
```

## generate controller 時にアクションを指定する
コントローラとアクションを生成したい場合は、generateにcontrollerの後ろにアクション名を指定します。

```bash:コントローラ生成の基本
rails g controller コントローラ名 アクション名
```
eventsコントローラとindex、showアクションを生成する例です。

```bash:eventsコントローラを生成
bundle exec rails g controller events index show
```
アクションだけでなく、ビューも生成されました。

# generate model でモデルを生成

```bash:Eventモデルを生成
rails g model event service:string longitude:decimal latitude:decimal event_url:string address:string started_at:datetime ended_at:datetime place:string limit:integer accepted:integer waiting:integer
```

# マイグレーションファイルを生成
rails generateコマンドでマイグレーションファイルを作成する基本構文は以下になります。

```bash:generateコマンドの基本
rails g migration マイグレーション名
```
## add_column でカラムを追加する書き方
モデルへカラムを追加するマイグレーションファイルは、rails generate migration AddほげほげToモデル名 という構文にします。

```bash:カラムを追加するマイグレーションファイルを生成
bundle exec rails g migration AddほげほげToモデル名 カラム名:型
```
今回は、すでにEventモデルがある状態で、新しいカラムを追加したい場合のマイグレーションファイルを作成します。

eventsというテーブルはすでに用意してあります。このイベントモデルにカラムを追加するコマンドを実行します。

```bash:Eventモデルにカラムを追加
bundle exec rails g migration AddColumnsToEvents service:string longitude:decimal latitude:decimal event_url:string address:string started_at:datetime ended_at:datetime place:string limit:integer accepted:integer waiting:integer
```
マイグレーションファイルが生成されました。

```rb:マイグレーションファイルにadd_columnを追加
class AddColumnsToEvents < ActiveRecord::Migration
  def change
    add_column :events, :service, :string
    add_column :events, :longitude, :decimal
    add_column :events, :latitude, :decimal
    add_column :events, :event_url, :string
    add_column :events, :address, :string
    add_column :events, :started_at, :datetime
    add_column :events, :ended_at, :datetime
    add_column :events, :place, :string
    add_column :events, :limit, :integer
    add_column :events, :accepted, :integer
    add_column :events, :waiting, :integer
  end
end
```
[add_column](http://railsdoc.com/references/add_column)を使用してカラムの追加を記述します。

##　rename_column でカラムをリネームする書き方
モデルへカラムを追加するマイグレーションファイルは、rails g migration RenameほげほげToモデル名 という構文にします。

```bash:Eventモデルのカラムをリネーム
bundle exec rails g migration RenameLimitToEvent

      invoke  active_record
      create    db/migrate/20150812225456_rename_limit_to_event.rb
```

chageメソッドの中にリネームする設定を書きます。

```rb:Migrationファイルにrename_columnを追加
class AddColumnsToEvents < ActiveRecord::Migration
  def change
    rename_column :events, :limit, :tickets_limit
  end
end
```
<a href="http://railsdoc.com/references/rename_column" >rename_column</a>を使用して`limit`というカラムを`tickets_limit`にリネームします。

# migrateを実行
マイグレーションファイルを生成したら、rails:db migrateするだけで反映されました。

```
bundle exec rails db:migrate
```
以前はrakeコマンドを利用したのですが、最近はrailsコマンドから使用できるみたいです。

# destroyでgenerateコマンドの取り消し
generateコマンドをTypoしてしまった場合は、generateの代わりにdestroyを指定すると、generateコマンドで生成ファイルを全て削除してくれます。

```bash:gemerateコマンドの取り消し
bundle exec rails destroy 処理
```

## generate controller の取り消し例
例えば `generate controller`コマンドの指定を間違えしまった場合です。複数形の`tickets`でコントローラを生成したかったのに 、下記のコマンドは単数形で生成してしまいました。

```bash:間違えてコントローラを生成
bundle exec rails g controller ticket
```

```bash:コントローラの生成を取り消し
bundle exec rails d controller ticket
```
`generate`と同じように`destroy`は`d`と短くショートカットを用意されています。
`generate`コマンドで生成されたファイルが全て消えました。

# 参考
* http://railsdoc.com/rails
* http://railsdoc.com/references/add_column カラム追加
* http://railsdoc.com/references/remove_column カラムの削除
* http://stackoverflow.com/questions/4997718/adding-multiple-columns-in-one-migration