# [rails4][migration][note]migration筆記
###### tags: `Rails4`,`migration`,`note`
### 修改column預設值
https://stackoverflow.com/questions/8638079/how-to-set-default-value-to-column-in-rails-while-creating-migration
```c!
$ rails g migration change_column1_in_table_name_plural
```
migration file
```ruby
#...
change_column :table_name_plural, :column_name, :integer, :default => 0
#...
```
### 修改column type
https://tosbourn.com/rails-migrate-change-column-type/
```c!
$ rails g migration change_column1_to_be_type_in_table_name_plural
```
```ruby=
class ChangePhoneToBeStringInCustomers < ActiveRecord::Migration
def up
change_column :customers, :phone, :string
end
def down
change_column :customers, :phone, :integer
end
end
```
### 新增unique column或將column設為unique
https://stackoverflow.com/questions/1449459/how-do-i-make-a-column-unique-and-index-it-in-a-ruby-on-rails-migration
>語法:
>rails generate migration add_index_to_table_name column_name:uniq
>
ex:將username設定為unique
```terminal
$ rails generate migration add_index_to_users username:uniq
```
產生migration後先**不要**執行migrate,
開啟產生的新migration檔:
```ruby
class AddIndexToUsers < ActiveRecord::Migration
def change
add_column :users, :username, :string #<--將此行註解或刪除
add_index :users, :username, unique: true
end
end
```
修改後再執行migrate
```terminal
$ rake db:migrate
```
>使用add_index語法產生migration檔,雖然只有add_index,migration還是會自動產生add_column,所以必須手動將該行註解或刪除
---
### 新增欄位至資料表
方1(自動增加欄位)
https://stackoverflow.com/questions/4834809/adding-a-column-to-an-existing-table-in-a-rails-migration
```c
$ rails generate migration add_fieldname_to_tablename fieldname:string
$ rake db:migrate
```
方2(手動增加欄位)
```c
$ rails generate migration add_column_name_in_table_name
```
migration檔範例
```ruby
class AddCatIdInProduct < ActiveRecord::Migration
def change
add_column :products, :cat_id, :integer
add_index :products, :cat_id
end
end
```
>migration修改完後記得執行rake db:migtrate
### 新增帶有reference的migration
https://stackoverflow.com/questions/22815009/add-a-reference-column-migration-in-rails-4
https://stackoverflow.com/questions/31843363/rails-how-to-delete-a-pending-migration/31843442
```c!
$ rails g migration addModelName1ToModelName2 ModelName1:references
$ rake db:migrate
```
>上述語法會在ModelName2所對應的table新增ModelName1_id欄位
---
### 移除尚未執行的migration
```c!
$ rails d migration migration_name_without_date_and_time
```
### 察看migration status
```c!
$ rake db:migrate:status
```
### 將已經執行過的最後一個migration倒回去
```c!
$ rake db:rollback
```
---