iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
1
自我挑戰組

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

遊記ep.8 Migrate!的Rails村

昨天寫了一堆頂叩叩的,看得其實連自己也霧煞煞,
今天想來簡單介紹一下 關於Rails,
因為 Ruby 跟 Rails 的關係探討有蠻多文件可以參考的,
這邊十分推薦高見龍,龍哥的——為你自己學Ruby on Rails。
所以就不贊述太多,Rails 其實就是使用 Ruby 語法開發出來的一種網站框架(Web Framework),
而我們主要就是想學習如何使用Rails來快速開發我們需要的環境,
為此,你想用別人的東西,那麼最基本的當然就是遵守開發者的規矩(慣例)了,

Convention over Configuration.

在Rails中有一句話是這麼說的。
來形容遵守慣例是多麼重要,因為遵守慣例可以讓你少寫許多程式碼,連帶可以節省你開發的時間。
舉例來說,當我們在建立 model 的時候,

rails generate model Ball type quantity:integer
Running via Spring preloader in process 30058
      invoke  active_record
      create    db/migrate/20190923140944_create_balls.rb
      create    app/models/ball.rb
      invoke    test_unit
      create      test/models/ball_test.rb
      create      test/fixtures/balls.yml

上面執行rails指令後,會自動幫我們生成一些必要的檔案,
順帶一提,generate 可以簡化 g ,而 model 名稱的慣例就是必須要符合大寫單數
所以我們這邊使用了 Ball ,而建立出的table名稱慣例則是小寫複數
model 名稱後面寫到的是兩個欄位名稱,這裡我們建立了 type 以及 quanatity 這兩個欄位,
在 rails 的慣例中,欄位名稱後面不接任何資料型態,會預設成 string 的資料型態,
而 quantity 這個欄位我們給了 integer 這個資料型態。
db/migrate/20190923140944_create_balls.rb 我們又稱作 migration 檔案,
我習慣把它看作是資料庫的藍圖,現在讓我們進去這個檔案中一探究竟~

class CreateBalls < ActiveRecord::Migration[5.2]
  def change
    create_table :balls do |t|
      t.string :type
      t.integer :quantity, default: 0

      t.timestamps
    end
  end
end

我們可以看到 Rails 在這個檔案裡面幫我們建立了一個方法
包含了 create balls 這個 table,有注意到了嗎,這裡已經幫我們轉成小寫複數
也幫我們建立了兩個欄位分別是 type 以及 quantity,而資料型態也是如上面設定的,
quantity這裡我們可以直接多增加一句 default:0 意指預設值為0。
那最後還有一個 timestampes是什麼呢?
這就是 Rails 免費送我們的,也是慣例的一部份,會自動幫我們建立 created_at 和 updated_at 的時間欄位,它會自動設定為資料新增的時間以及更新時間。
但在這個時候呢,其實只是畫好了資料庫的藍圖而已,
資料庫內目前還是空空蕩蕩,我們還欠缺了最後一個步驟:
#

rails db:migrate

說這是 rails 靈魂中的一擊其實一點都不為過,
因為當我們執行這行指令的同時,就確確實實的在資料庫中建立了我們藍圖設計的一切。
但,總是會有失手的時候,例如在藍圖中的打錯資料型態、打錯欄位名稱等等意外,
那要怎麼樣回復上一動呢?

rails db:rollback
= 20190923140944 CreateBalls: reverting ======================================
-- drop_table(:balls)
   -> 0.0018s
== 20190923140944 CreateBalls: reverted (0.0180s) =============================

這邊我們可以看到,出現了 drop_table 的字樣,其實這是在幫我們執行把table刪除掉的指令,
這時候我們就可以回到 migration檔案去修改我們希望修改的部分。
別忘記修改完後要再執行一次 rails db:migrate 才能具現化出我們資料庫的實體!

最後想提醒一下,rollback 這個指令本身是有風險的,因為他的作用是直接去刪除資料庫的table,
並不會在意你的資料表上的資料,要是你的資料表上已經有資料了,除非那些資料是可以被取代的,
不然並不建議使用 rollback 來修正,可以依據需求另外新增一個 migraion檔案來進行修改。


上一篇
遊記ep.7 比鄰而居的Rails村
下一篇
遊記ep.9 沒有?那就自己來吧!的Rails村
系列文
Ruby菜鳥村村民遊記30

尚未有邦友留言

立即登入留言