Database migrations
建立 User model,同時包含兩個欄位 name、email,以及欄位的類型:
$ rails generate model User name:string email:string
invoke active_record
create db/migrate/20160306065508_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
Rails 會自動幫 User model 建立一個資料表(users table),裡面就包含 name、email,其中 id 欄位是自動建立的索引:

之後若是有資料存進資料庫就會長得像這樣:

另外也會產生一個遷移檔案(migration)db/migrate/20160306065508_create_users.rb,用來處理資料庫綱要,Rails 會持續追蹤提交到資料庫的檔案,但要真正建立資料表,需要執行 rake db:migrate。
另外遷移檔案的前綴檔名是使用時間戳章(timestamp)來命名。
產生的遷移檔案如下:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false
end
end
end
其中有一個 change 方法,可以定義資料庫要做什麼操作。change 方法使用 Rails 提供的 create_table 方法在資料庫中建立一個 table,用來儲存使用者。
create_table 方法可以接受一個 block ,block 裡面有一個變數 t (table)。在 block 中,create_table 方法透過 t 物件建立 name 和 email 兩個欄位,兩者都是 string 類型。
table 名稱是複數形(users),Model 名稱是單數形(User),這是 Rails 命名慣例:Model 表示單一使用者,而 table 裡儲存很多使用者。
block 中的最後一行 t.timestamps null: false 是個特殊用法,它會自動建立兩個欄位,created_at 和 updated_at,這兩個欄位分別記錄使用者的建立時間和更新時間。
現在要建立資料表執行(migrating up):
$ rake db:migrate
第一次執行 rake db:migrate 時,會建立一個 db/development.sqlite3 檔案,這是 SQLite 的資料庫。
可以使用 DB Browser for SQLite 來查看 db/development.sqlite3 的資料結構。
Rails 提供回滾功能(rollback),可以讓遷移檔案回復到上一個動作(migrate down):
$ rake db:rollback
這個指令會調用 drop_table 方法,把 users table 從資料庫中刪除。可以這麼做是因為 change 方法知道 create_table 的反義操作是 drop_table,所以回復時會直接調用 drop_table 方法。
對於一些無法回復的遷移,例如刪除欄位,就必須要分別定義 up 和 down 方法 來代替 change 方法。