Active Record Query Interface part1

Posted by Anthony Chao on 2019-10-04

Active Record Query

有人說,使用 Ruby on Rails 的工程師,SQL 語法通常不怎樣
會這樣說的原因是, Rails 中的 Active record 查找實在太好用了,所以很少遇到找不到資料的狀況,也因此很少用 SQL 語法

Active Record 跟大多數的 database 相容,像是 MySQL, MariaDB, PostgreSQL, 還有 SQLite 等等


查找單一資料

Find

find 應該是一般來說會用最多的查找方法,它幫我們找到 primary key 符合的資料

1
2
# 找到 primary_key (id) 是 10 的資料
client = Client.find(10)

在這裏提一下,如果沒有設定的話,primary_key 預設是 id 欄位

其實 find 還可以查找多筆資料

1
2
# 找到 primary_key (id) 是 1 跟 10 的資料
clients = Client.find([1, 10])

不管是查找多筆資料還是單筆資料,只要有其中一筆資料找不到,就會跳出 ActiveRecord::RecordNotFound 這個例外

Take

take 可以用來取不限定條件的資料

1
2
3
4
# 取 Client 的第一筆資料做為 client 使用 (一個實體)
client = Client.take
# 取 Client 的頭兩筆資料做為 clients 使用(一個陣列)
clients = Client.take(2)

另外還有驚嘆號版本的 take! 不同點只在於驚嘆號版本在取不到資料時會跳出 ActiveRecord::RecordNotFound 例外

Find_by

find_by 可以用自訂條件搜尋,並且回傳拿到的第一筆資料

1
2
# 找 Client 其中 first_name == 'Lifo' 的第一筆資料
Client.find_by(first_name: 'Lifo')

外還有驚嘆號版本的 find_by! 不同點只在於驚嘆號版本在取不到資料時會跳出 ActiveRecord::RecordNotFound 例外


查找多筆資料

介紹查找多筆資料的方法之前,必須要知道如果我們要對大筆資料操作的話通常會使用 Model.all.each,但在資料庫的資料很多的情況下,這樣有可能會超過記憶體空間,基於這個理由,Rails 又另外設計兩種方法可供選擇

Find_each

find_each 會把資料分成好幾批,拿了一批資料再把這一批裡面的每一筆放到 block 中處理,處理完這一批再繼續下一批

1
2
3
User.find_each do |user|
NewsMailer.weekly(user).deliver_now
end

Find_in_batch

find_in_batches 一樣把資料分成好幾批,不同的是他會把整批資料放到 block 中做處理

可以用的選項

可以用的選項有 :batch_size ,用來指定要把多少筆資料分成一批,預設是 1000 筆資料

:finish:start 這兩個選項用來指定要從哪個資料開始處理,並且要處理到哪個資料為止

我們今天的內容就到這裡囉!

參考資料:

Rails Guide





prevent_hack