LoginSignup
0
0

More than 3 years have passed since last update.

paginateに条件を加える

Posted at

特定のデータをページネーションで表示させるためにいろいろと調べたのでメモ

いつもの

ページネーションの例に載っているような使い方だと

Gemfile
gem 'will_paginate',           '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'
#=> bundle install実行

まずはGemfileに追加した後コマンド実行。
コントローラでインスタンス変数.paginateと追加。

words_controller
def index
  @words = Word.paginate(page: params[:page], per_page: 10)
end

wordsテーブルにあるすべてのデータをページネーションとして表示させるならあとはビューに
<%= will_paginate @words(@wordsはどっちでも可) %>
を置くだけで準備完了です。

本題

条件を何も指定していないページネーションだとテーブルの全データ表示になるので、
per_page: 10
とか一ページにいくつ表示するかを指定しても、内部では全データを表示した前提での指定数を表示します。

例によってwordsテーブルのcompleteカラムがtrueのページネーションとfalseのページネーションを作りたいと思います。
trueの値のデータが15個、falseの値のデータが10個あったとします。

words_controller
def index #(trueのページネーションづくり)
  @words = Word.paginate(page: params[:page], per_page: 10)
end

def practice #(falseのページネーションづくり)
  @words = Word.paginate(page: params[:page], per_page: 10)
end

先ほどと同様のメソッド内容で実験。
仮にデータの値の順番(id:1~)t,f,t,f,t,f,...(t=true,f=false)と交互だとすると、trueのページだと一ページ目には10個表示されるはずが5つしか表示されません。falseのページも同様の結果です。
これはWord.allをページネーションするため変換したのがWord.pagenateとなっているからです(私調べ)。
trueのみが表示されるページでも内部では表示されないfalseの数も含まれているため、5つしか表示されなかったんですね。

メソッド内変更

words_controller
def index #(trueのページネーションづくり)
  @words = Word.paginate(page: params[:page], per_page: 10).where(complete: false)
end

def practice #(falseのページネーションづくり)
  @answers = Word.paginate(page: params[:page], per_page: 10).where(complete: true)
end

これでtrueならtrueだけで数がカウントされます。falseも然り。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0