---
# System prepended metadata

title: '[08/09_a] Rails實作 M => V'
tags: [面試題, Rails]

---

# [08/09_a] Rails實作 M => V
## 什麼是Migration
* 資料表的演進過程。
* 基於歷史紀錄，可做版本控制。
* 會記錄在 schema.rb 檔案以及 sqlite3 的 schema_ 裏面。
* 指令
    * **db:migrate** 掃視新資料，僅限一次。
    * db:rollback 做逆向工程，讓他反向操作（還原）。
        * 或是 db:schema:load 根據schema.rb 載入檔案，還原資料庫。
    * db:migrate前記得存擋，不然無法呈現，只能作一次。

## Model層級中之資料庫關聯性
- 一對一：belongs_to
- 一對多：has_many

## 建立Model
產生Model的過程，要建立一個資料表。
因為Model是抽象概念，資料表/資料庫是實體存在的。所以只建立Model不夠，還要建立Migration（描述資料表內容）。

網址後面通常是 model 的名字。
開兩個ubuntu終端，一個啟動rails server不要關，一個做事。
![](https://i.imgur.com/p5xlO1a.png)

1. model名稱用**首字大寫單數，對應migrate表格/Views目錄下的同名複數**。不能跟專案名稱、其他model或是保留字一樣。
    撞名：model 名稱不能與 專案名稱、其他 model 或是保留字一樣。
3. 新model名（user）後面接欄位（欄位生成migration）：
     > $ **rails g model** User account:string password:string email:string nickname:string
4. 欄位為字串型態（string）可不寫。
     > $ **rails g model** User account password email
5. 產生新檔案：
    1. 產生"app/model"下的新rb檔（不用編輯）
    3. 產生 **"db/migrate"下的新rb檔**
    －可建立真正的資料表
    －會得到**複數model名的migration！**
    －會自動加時間戳記timestamps


1. 建立新表格資料庫（會在建立在"db/**development.sqlite3**）：
    > **$rails db:migrate**
1. 安裝DB Browser for SQLite檢視專案的db目錄
    字串string屬性在裡面會顯示為varchar

萬一寫錯要刪除
> $rails **d** model User account password email

## 建立表單
利用Routes給出的路徑。參見RB-15。

## 異動Migration
### (危險指令) 建立新表格失敗時，可撤回上一步
**出現no such table錯誤時：**
1. 先將migration註解掉，存檔
1. rollback回上一步
    > $rails db:rollback 
3. 解除註解再重來db:migrate建立新表格

**若有表格改名，就建新的migrate。盡量往前走，不要回溯。**
> $rails g migration 新名字 

### (危險指令) 資料庫被刪除，可逆轉
根據schema.rb這個檔案，自動載入檔案，跳過錯誤，還原資料庫。
> $rails db:schema:load

------------
利用利用resources 創造8條路徑中path，開始建立表單（從view抓model）。見下一篇筆記。

------------

補充：
Python有一個django框架。


###### tags: `Rails`
###### tags: `面試題`