| giive 兄寫了一篇 Rails 內建的 Pagination 簡介 。不過官方 Rails Blog 推薦 的這篇文章 Guide: Things You Shouldn’t Be Doing In Rails ,強烈的建議不要使用內建的 Pagination。甚至,在 Rails 2.0 還要完全的把 Pagination 移出 core 而獨立成一個 Plugin。究竟這個內建的 Pagination 有什麼問題呢?
1. 雖然使用 paginate 時,產生的 SQL 不會將沒有要顯示的資料選取出來,但是有時候我們需要比單純的 find 來的複雜,會需要用到自訂的query。
正
確的做法是做一個新的 class 繼承 Pagination,然後 override
count_collection_for_pagination 和 find_collection_for_pagination
兩個method,(當然你要在這兩個 methods 中做出正確的 query)。再用這個新的 class 來產生 pagination。
不過很多懶惰人(就是我啦!),會直接用 find_by_sql 把全部的 182,443,567,9832 筆的 records 選回來,再用 paginate_collection 來做出分頁的效果,自然就無比的浪費。
這點不能算是 Pagination 的錯,畢竟是亂用。可是因為內建的關係,讓很多人都沒有仔細去看看 Pagination 到底做了些什麼事,才會出這樣的問題。
2. 使用 pagination_links 來產生選頁的連結是蠻慢的,根據 這一篇 ,用 pagination_links_each 會比較快。
不過若是分頁出來的頁數太多,會有放不下這麼多頁連結的問題。這時要使用到 :window 這個選項,而這個選項是很慢很慢的。
所以說,即使在沒有 Database overhead 的情況下,內建的 Pagination 在資料量很大的時候還是會有效能的問題。解決的辦法?參考這幾篇文章:
Faster Pagination in Railseager-find-by-sql-pagination-in-railsPagination Find Pluginpaginate_by_sql |