0%

Ruby on Rails 網站開發 練習 - ActiveRecord - 資料表關連 part 4 (ORM基本操作)

ActiveRecord - 資料表關連 part 4 (ORM基本操作)

ORM 基本操作之 Create

  • new 方法會建立一筆資料,但還不會將資料存到資料庫裡。
  • create 或 create! 會建立一筆資料,並直接寫入資料庫裡。
  • create 跟 create!這兩個方法有什麼不同?
    答案:
    create → 寫入失敗的時候,會默默地rollback回來,會默默地取消這次交易(transaction)。
    create! → 寫入失敗時,會立刻噴出Exception(發生例外)。之後可以用 begin、rescue的方法來處理這些Exception


ORM基本操作之 Read

  • first 與 last
  • fing_by(id: 1) 與 find(1)
  • find_by_sql
  • find_each

find()與find_by差別

就像 cteatecreate!的差別一樣
find(1):是比較激進派的做法,當找不到資料的時候,會跳出錯誤訊息(exception)。

find_by(id: 1):當找不到資料的時候,會回傳一個 nill 給你,屬於比較溫和派的作法。

find_each:利用跑回圈的方式,預設是一千次,當今天是在用大型資料查詢的時候,find_each可以有效地減少電腦記憶體的使用。

答案:


ORM基本操作之 Read

  • all
  • select
  • where
  • order
  • limit

    where 跟前面提到的 find_by(id: 1)差別是,where 會回傳「一包長得像陣列」的資料回來。

ORM基本操作之 Read

  • count
  • average
  • sum
  • maximum & minimum
  • 不要傻傻的用ORM抓出來轉迴圈再來計算!!!

ORM基本操作之 Update

  • save
  • update
  • update_attributes
  • update_all


    答案:
    這兩個方法本質上是一樣的。

ORM基本操作之 Update

  • increment 與 decrement
  • toggle
  • 上面2項用到的方法,都沒有存檔的功能,所以記得要執行.save

ORM基本操作之 Delete

  • delete
  • destroy
  • detroy_all(condition = nil)


    答案:
    (1)delete是直接把資料刪除就結束了,dedtroy是會經過一連串的callback。
    (2)destroy是真的把資料刪掉,從資料表上整個刪除,所以也救不回來。

Scope(範圍)

  • 把一群條件整理成一個Scope
  • 簡化使用時的邏輯
  • 減少在Controller裡寫一堆Where組合
  • 用起來跟類別方法一樣

    已投摽系統舉例,要依照候選人年紀來篩選資料。先到candidate_controller.rb

    再到candidate.rb

Scope(範圍)

  • default_scope 可幫所有的查詢預設套用 scope
  • default_scope 的副作用?
    答案:
    default_scope的副作用就是它會一直跟著你。

    要擺脫它必須做undcope把它拔掉。

類別方法


【練習題】

  • scope 跟類別方法有什麼不一樣?
  • 什麼時候該用什麼寫法?
    答案:
    如果是相對簡單的查詢,只要寫一行就可以解決,可以優先考慮使用scope的寫法。
    遇到比較複雜的時候,會使用類別方法。
    沒有絕對答案,看每個人的習慣。

資料驗證

  • presence

    還有另外一種早期寫法

  • format

  • uniqueness

  • numericality

  • length

  • condition


資料驗證過程



【練習題】

  • 硬是要繞過驗證可以嗎?
  • 只要以驗證就可以保證資料正確嗎?
    答案:
    (1)如果硬要繞果驗證,其實是可以的。但基本這樣做沒有任何意義。

(2)如果說整個系統都是用Rails寫,然後Model都有做驗證的話,基本上可以保證資料都是正確的。
但是如果說今天你的系統或是資料庫有跟別的系統共用的話,那就很難說了。


Callback


舉例

【練習題】

  • 在前面的範例中,用before_save會造成什麼問題?
  • before_save跟before_create有什麼差別?
    答案:
    before_save:是資料寫入及資料更新的時候都會被執行。
    before_create:是只有在資料被建立的時候執行。

參考來源:為你自己學 Ruby on Rails (https://railsbook.tw/)