テクノロジー
2017年10月17日ページネーションとkaminariについて
今回の記事では、Railsでページネーション処理を簡単に実装できる kaminari と呼ばれるgemとその使い方についてご紹介していきます。
ページネーションとは大量の情報を分割し、それぞれのページへ遷移しやすくするためのリンクのことです。
ページネーションとkaminari
今回の記事では、Railsでページネーション処理を簡単に実装できる kaminari と呼ばれるgemとその使い方についてご紹介していきます。
ページネーションとは大量の情報を分割し、それぞれのページへ遷移しやすくするためのリンクのことです。
ページネーションをすることで、以下3点のメリットが存在します。
- 今自分がどのあたりのページを見ているかがわかる
- どのくらいの情報量があるかを一目で確認できる
- 検索エンジンがクローリングしやすくなり、SEO対策につながる
これを実現するためのgemが kaminari なのです。
試しに、何か適当なrailsアプリを用意して bundle install で kaminari を入れてみましょう。
# Gemfile
gem 'kaminari'
インストールした後は、kaminari用のデータを用意すると試しやすいでしょう。
ここでは例として blog を用意し、100件のシードデータを入れています。
(コンソール)
rails g scaffold Blog title content
(app/db/seeds.rb)
100.times do |i|
Blog.create!(
title: "#{i}番目のブログ",
content: "#{i}番目のブログの内容"
)
end
(コンソール)
rails db:migrate
rails db:seed
この状態でBlogのindex画面を表示すると、このような状態になっています。
長すぎて下にスクロールするだけで大変ですね。
ではここからページネーションの実装をしていきましょう。
まずは1ページに何件のレコードを表示させるかを モデル に設定します。
今回は1ページに10件表示させます。
(app/models/blog.rb)
paginates_per 10
次にコントローラでは、ページネーションを実現するために pageメソッド を用いて以下のように記述します。
(app/controllers/blogs_controller.rb)
def index
@blogs = Blog.page(params[:page])
end
さらに、Viewでページ数の表示と切り替え用のコードを追記します。(indexアクション内にあるデフォルトの記述は消しておきましょう)
(app/views/blogs/index.html.erb)
<%= page_entries_info @blogs %>
<%= paginate @blogs %>
こうすると、下記画像のようなページネーションが完成します。
これらの機能の仕組みとして、コントローラの pageメソッド ではSQLの LIMIT と OFFSET が実行されています。
(コンソール)
SELECT * FROM blogs LIMIT 10 OFFSET 0;
LIMIT 10 は、先ほどモデルに定義した paginates_per 10 に該当します。
OFFSET は、 (ページ番号 - 1) × LIMIT を指します。
例えば10レコード/ページでページネーションをしている時は以下のようになります。
| ページ番号 | LIMIT | OFFSET |
|---|---|---|
| 1 | 10 | 0 |
| 2 | 10 | 10 |
| 3 | 10 | 20 |
ページネーションのおかげで、レコードが10,000件あったとしても LIMIT がかかるのでアプリケーションの速度向上に繋がります。
毎回使われることのなデータを取得するのは意味がありません。
ここまでで、ページネーション実装方法のご紹介は終わります。
とても簡単かつ便利な代物なので、皆さんもぜひページネーションを使いこなしてみてください。


