## Migration
==描述資料表的樣子 , 記錄資料表演進的過程==
使用 Migrations 可以有記錄地進行資料庫修改,
每次變更就是一筆 Migration 記錄。在沒有 Migration 之前,如果你手動修改了資料庫,那麼你就必須通知其他開發者也進行一樣的修改步驟。
另外,在正式佈署的伺服器上,你也必須追蹤並執行同樣的變更才行。而這些步驟如果沒有記錄下來,就很容易出錯。
Migrations 會自動追蹤哪些變更已經執行過、哪些還沒有,
只要新增 Migration 檔案,然後執行 rake db:migrate
- migration方法
### 新增 Migration 檔案
執行指令,就會在 db/migrate/ 目錄下產生20110203070100_migration_name.rb 的檔案
```
rails g migration migration_name
```
### Migration 可用的方法
對資料表做修改:
- create_table(name, options) 新增資料表
- drop_table(name) 移除資料表
- rename_table(old_name, new_name) 修改資料表名稱
- change_table 修改資料表欄位
個別修改資料表欄位:
- add_column(table, column, type, options) 新增一個欄位
- rename_column(table, old_column_name, new_column_name) 修改欄位名稱
- remove_column(table, column) 移除欄位
- change_column(table, column, type, options) 修改欄位的型態(type)
- change_column_default(table, column, new_default_value) 變更欄位的預設值
新增、移除索引:
- add_index(table, columns, options) 新增索引
- remove_index(table, index) 移除索引
options 可為空,或是`:unique => true`表示這是唯一。
新增、移除外部鍵限制:
- add_foreign_key(from_table, to_table, options)
- remove_foreign_key(from_table, to_table, options)
- migration流程
1. db => migrate 把 table 的欄位建好
可用 scaffold 『建立"使用者功能"』
```
$ bin/rails generate scaffold User name:string email:string tel:string
簡寫
$ rails g scaffold User name email tel
```
建立一個表格(table),
裡面有 `name`、`email` 以及 `tel` 三個欄位,分別都是字串(string)型態。在 Rails 專案,這樣的檔案稱之遷移檔(migration file)
2. 把 [[migration方法]] 具現化 , `rails db:migrate`
3. 啟動 Rails Server = `rails s` ,打開瀏覽器,連上網址 [http://localhost:3000/](http://localhost:3000/) 就能看到主頁面
`rails db:migrate
做過之後, 再做第二次 沒有效果
( Ex . 忘記存檔 , )
開錯欄位就再做一個新的 migration
```
rails g migration rename_to_subject
```
到rails API 找rename_column 的方法 (改名)
寫入 RenameToSubject
```
把title 的欄位更名 subject
rename_column(:articles, :title, :subject)
```
要新增欄位 找add_
查看 migration 狀態
`rails -T` 在rails 裡可以做的指令
找到 `rails db:migrate:status` 並輸入終端機
```
status Migration ID MigrationName
-----------------------------------------
up 20230713042611 Creat articles
down 20230713060646 Rename to subject
```
up : 已經做過 db:migration 了
down : 還沒做過