今天想繼續補完昨天介紹的 migrate
昨天提到如果像是打錯名稱、資料型態打錯,
都可以使用rails db:rollback
這個指令倒退回去,
之後再去修改 migration 檔案後再rails db:migrate
。
如果今天我想為某個table增加一個欄位呢?我還要再rollback回去嗎
這樣看起來資料好像永遠都建立不了了因為一直在rollback...
既然table中沒有我要的欄位,那當然就自己動手做囉!
rails g migration add_gender_to_users
Running via Spring preloader in process 40299
invoke active_record
create db/migrate/20190924150518_add_gender_to_users.rb
這裡我想做的是在 users 這個 table 中新增一個欄位叫 gender
新增了一個 migration 的檔案,其實檔名格式沒有硬性規定,但這樣做的好處是
日後再回頭來看的時候只要從檔名就能知道這個 migration 檔案做了什麼。
那麼,我們打開這個檔案看看吧!
class AddGenderToUsers < ActiveRecord::Migration[5.2]
def change
end
end
打開後,裡面當然什麼都沒有寫,所以我們還必須在裡頭做點手腳~
class AddGenderToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :gender
end
end
這裡我們所做的就是 在 users 這個 table 去新增一個 gender欄位 資料型態是string
藍圖畫完後,別忘了具現化它~所以我們還需要去下rails db:migrate
這個指令。
完成以後,我們可以來到 schema.rb 這個檔案中,來看看是否 users 已經新增了一個 gender 欄位了
create_table "users", force: :cascade do |t|
t.string "gender"
end
只要指令確實執行成功,應該是會在這裡看見你建立的欄位~
不過要提醒,修改 schema.rb 檔案並沒有任何意義,因為這個檔案是依據 migration 檔案內容而建立起來的。
所以只要一執行 db:migrate 又會立刻被覆蓋回來~
除了上述這個方法之外,
我們其實也可以一口氣寫完並建立我們要的欄位:
rails g migration add_gender_to_users gender age:integer:index
Running via Spring preloader in process 40557
invoke active_record
create db/migrate/20190924152849_add_gender_to_users.rb
我們一樣打開這個 migration 一探究竟:
class AddGenderToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :gender, :string
add_column :users, :age, :integer
add_index :users, :age
end
end
Magi~~~~~~c!
是的,前面雖然說檔名並沒有硬性規定,但其實養成好習慣還是有獎勵的,
當檔名中有 add_xxx_to_xxx
或者 remove_ooo_to_ooo
並在後頭接著你想加入的欄位名稱以及型態,rails 就會非常聰明的幫你內建出來,
所以不管你要手動加欄位,或者請 rails 幫我們寫好,自己順手就好,
最重要的是,不要忘記藍圖畫好,還要具現化!db:migrate!