Database migrations

建立 User model,同時包含兩個欄位 nameemail,以及欄位的類型:

$ 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),裡面就包含 nameemail,其中 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 方法可以接受一個 blockblock 裡面有一個變數 t (table)。在 block 中,create_table 方法透過 t 物件建立 nameemail 兩個欄位,兩者都是 string 類型。

table 名稱是複數形(users),Model 名稱是單數形(User),這是 Rails 命名慣例:Model 表示單一使用者,而 table 裡儲存很多使用者。

block 中的最後一行 t.timestamps null: false 是個特殊用法,它會自動建立兩個欄位,created_atupdated_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 方法。

對於一些無法回復的遷移,例如刪除欄位,就必須要分別定義 updown 方法 來代替 change 方法。