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差別
就像 cteate
跟 create!
的差別一樣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/)