[Ruby] count, length, size 差異
count
使用 SQL query (SELECT COUNT(*) FROM…
)
不會儲存計算物件,每次執行 count 都會重新跑一次 SQL query
速度比 length 快
length
回傳一個集合的長度 計算物件會儲存在記憶體中 如果是 eager loaded 的物件,執行速度會非常快
size
綜合上述兩者的特性 如果是已經在記憶體中的集合,就直接計算長度 (不會有額外的 query) 如果是 lazy loaded 的集合,就會直行 SQL query
補充
在 Association 的情況下,查找關聯的數量時如果表上有 xxx_count
這種欄位,則用 #size
會直接撈取這個欄位出來,而 #count
則是會再跑 COUNT(*)
這種 SQL 去算
Rails 的 Model 裡面有一個內建的 counter cache 功能幫助你記錄
只要設定好 counter_cache: :xxx_count
(xxx 是你剛剛建立的欄位名稱)
只要 xxx 有 create
跟 destroy
的動作,就會自動在 xxx_count 欄位 +1 跟 -1
避免使用 #count
在程式的迴圈裡面跑太多 SQL 搜尋,以減少網站 server 的負擔