[ Rails guide study ] Day28 Active Record Query Interface
首先,來聽首歌吧
Mr.Big 是我最喜歡的搖滾樂團,沒有之一,就算在現在聽這首歌也沒有過時的感覺,重點還是超強的吉他手 + 貝斯手 + 嗓音超獨特的主唱,希望大家喜歡!
有人說,使用 Ruby on Rails 的工程師,SQL 語法通常不怎樣
會這樣說的原因是, Rails 中的 Active record 查找實在太好用了,所以很少遇到找不到資料的狀況,也因此很少用 SQL 語法
Active Record 跟大多數的 database 相容,像是 MySQL, MariaDB, PostgreSQL, 還有 SQLite 等等
find
應該是一般來說會用最多的查找方法,它幫我們找到 primary key 符合的資料
# 找到 primary_key (id) 是 10 的資料
client = Client.find(10)
在這裏提一下,如果沒有設定的話,primary_key 預設是 id 欄位
其實 find
還可以查找多筆資料
# 找到 primary_key (id) 是 1 跟 10 的資料
clients = Client.find([1, 10])
不管是查找多筆資料還是單筆資料,只要有其中一筆資料找不到,就會跳出 ActiveRecord::RecordNotFound
這個例外
take
可以用來取不限定條件的資料
# 取 Client 的第一筆資料做為 client 使用 (一個實體)
client = Client.take
# 取 Client 的頭兩筆資料做為 clients 使用(一個陣列)
clients = Client.take(2)
另外還有驚嘆號版本的 take!
不同點只在於驚嘆號版本在取不到資料時會跳出 ActiveRecord::RecordNotFound
例外
find_by
可以用自訂條件搜尋,並且回傳拿到的第一筆資料
# 找 Client 其中 first_name == 'Lifo' 的第一筆資料
Client.find_by(first_name: 'Lifo')
外還有驚嘆號版本的 find_by!
不同點只在於驚嘆號版本在取不到資料時會跳出 ActiveRecord::RecordNotFound
例外
介紹查找多筆資料的方法之前,必須要知道如果我們要對大筆資料操作的話通常會使用 Model.all.each
,但在資料庫的資料很多的情況下,這樣有可能會超過記憶體空間,基於這個理由,Rails 又另外設計兩種方法可供選擇
find_each
會把資料分成好幾批,拿了一批資料再把這一批裡面的每一筆放到 block 中處理,處理完這一批再繼續下一批
User.find_each do |user|
NewsMailer.weekly(user).deliver_now
end
find_in_batches
一樣把資料分成好幾批,不同的是他會把整批資料放到 block 中做處理
可以用的選項有 :batch_size
,用來指定要把多少筆資料分成一批,預設是 1000 筆資料
:finish
跟 :start
這兩個選項用來指定要從哪個資料開始處理,並且要處理到哪個資料為止
我們今天的內容就到這裡囉!
參考資料:
本文章同步分享於 http://anthonychao.site/