iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 9
1
自我挑戰組

Ruby菜鳥村村民遊記系列 第 9

遊記ep.9 沒有?那就自己來吧!的Rails村

今天想繼續補完昨天介紹的 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!


上一篇
遊記ep.8 Migrate!的Rails村
下一篇
遊記ep.10 關聯性的Rails村
系列文
Ruby菜鳥村村民遊記30

尚未有邦友留言

立即登入留言