---
# System prepended metadata

title: 12th 鐵人賽 Day_12 migration?
tags: [12th 鐵人賽]

---

---
title: 12th 鐵人賽 Day_12 migration?
tags: 12th 鐵人賽
--- 
# 12th 鐵人賽 Day_12 migration?

嗨！各位朋友大家好，打給後，歹嘎吼，胎尬喉，我是阿圓，一樣有請今天的one piece：
![](https://i.imgur.com/V1Rlkj8.jpg)
(不覺得羅很帥嗎？不覺得他很帥很帥很帥嗎？！)


## migration ？
這個就是今天的問題啦～
(都用他建立了無數個資料表了，現在才想問問看這個是什麼 😂 ）
>Migrations are a feature of Active Record that allows you to evolve your database schema over time. Rather than write schema modifications in pure SQL, migrations allow you to use an easy Ruby DSL to describe changes to your tables.
>*- 擷取自官方文件*


若不使用migration來處理可不可以？可以，自己去下SQL語法也能做到同樣的事，但是，若你是跟別人協作，請記得去提醒你同事下一樣的指令😂

Rails 是利用 migration 來處理資料表**結構**的新增修改刪除，特色如下：

### 1. 自動翻譯成相對應的SQL語法
你可以使用ruby的語法寫出你想要的資料表欄位那些的，Active Record，會根據你指定給他的 database (預設是sqlite3) 去做翻譯。

### 2. 自動追蹤 migration 是否已經執行過
這個功能就很重要了，它可以讓專案在不同電腦中保有相同的結構！
有請圖解：
![](https://i.imgur.com/AiwQOiD.png)

這樣就不用記下你做了什麼，然後讓你同事跟著做一次。這邊是只有舉兩個人當例子，在使用migration的情況下，就算人數越來越多，大家也只要一行簡單的 `rails db:migrate` 而已 👍

### 建立 migration
Rails 在建立 model 的時候，會自動幫你長出一個 migration ，若有其他需求，像是要更改已建立好的 model 資料表，也可以使用 `rails g migration` 建立出一個 migration 的檔案，再來寫內容，不過當指令後面加上 `add...to...` 或 `remove...from...` 時，神奇的 Rails 魔法就會幫你把內容都寫好了！

至於migration裡面要怎麼寫，有請各位參考：
1. [官方文件](https://guides.rubyonrails.org/active_record_migrations.html)
2. [Ruby on Rails 實戰聖經 - Active Record - 資料庫遷移(Migration)](https://ihower.tw/rails/migrations.html)


## 部落格實作
繼續回到我們的部落格吧，之前把管理員登入登出系統做完了，今天讓我們來著手個人檔案的部分吧！

### 修改資料表欄位
先在 admins 的 資料表來增加一些欄位：

1. 大頭貼 ：string
(這個打算之後使用了carrierwave 之後一次做處理，先把欄位開給他。)
3. 信箱: string
4. 簡介 : string
5. 工作經歷 : string

先製作出一個migration
`rails g migration add_column_to_admins avatar email introduction experience`
這邊就使用了上面所說的`add...to...`，後面放上你要加的欄位，並指定型別給他(string 可省略)後．．．

![](https://i.imgur.com/R0k38QE.jpg)


rails 就幫我做好 migration 了！
```ruby=
class AddColumnToAdmins < ActiveRecord::Migration[6.0]
  def change
    add_column :admins, :avatar, :string
    add_column :admins, :email, :string
    add_column :admins, :introduction, :string
    add_column :admins, :experience, :string
  end
end
```
檢查沒有問題，就可以`rails db:migrate`了

### 修改路徑

前天才大言不慚的說自己不需要預設的admin路徑，今天馬上打臉(汗😓 )
因為有增加欄位，之後希望可以修改，所以還是要去把那些路徑加回去:

```ruby=
Rails.application.routes.draw do
  # # 之後指定根目錄為貼文首頁
  root 'admins#index'

  resource :admins, except:[:new, :create, :destory] do
    collection do
      get :sign_in
      post :sign_in, to: 'admins#login'
      delete :sign_out
    end
  end
end
```
此時的路徑：
![](https://i.imgur.com/Xx3x1Iv.png)


接下來的步驟跟之前有點重複，這邊只簡單講一下大目標：
1. 增加 admins_controller 中 show、edit、update 的 action
2. 用form_helper 做出 edit.html.erb 的頁面。
3. 做出 show.html.erb 的頁面 


感謝各位看到這邊，我把code的部分放在[git hub](https://github.com/gn2481/yuan_blog)了，~~(去尋找吧！)~~ 咳咳！可以點連結去看，若有任何建議，還請各位不吝指教！那我們明天見！
![](https://i.imgur.com/PPbpd2b.gif)
