LoginSignup
0
0

More than 1 year has passed since last update.

kaminari のメソッドのレシーバーが配列のときどうするか

Last updated at Posted at 2021-11-14

Image from Gyazo

上の画像では右側のユーザーが current_user なんだけど
自身のアカウントは検索画面で表示されないようにしたかった

開発環境

ruby 2.6.5
Ruby on Rails 5.2.5

前提

user の認証機能があるアプリ
slim を使って書いている
kaminari のページネーションで user の一覧を表示している
検索機能を実装している

next メソッド

まず考えたのは next メソッド

user_html.slim
  - @users.each do |user|
    - if user == current_user 
      = next

こんなかんじで繰り返し処理のなかで current_user だったらスキップする

しかし

Image from Gyazo

繰り返しはスキップされているけど css は生成されてしまっている
これではダサい

reject メソッド

繰り返しをスキップするのではなく DB のデータを加工するべきだと考えた

reject メソッドをつかってみる

コードは

user_controller.rb
@users = @q.result(distinct: true)
@users =@users.reject{|user| user == current_user}

こんなかんじ。
これで usercurrent_user のときだけ reject した配列を返す

データもいい感じ

これに kaminari のページネーションをしているので

user_controller.rb
@users =@users.reject{|user| user==current_user}.page(params[:page]).per(6)

とする。

するとなぜか nomethod エラー

なぜ


どうやら kaminari のレシーバーは ActiveRecord を継承している必要がある

なので

user_controller.rb
 @users = @q.result(distinct: true)
 @users = User.where(id: @users.reject{|user| user == current_user}.pluck(:id)).page(params[:page]).per(6)

こういうコードを書いたらいけた

追記

どうやら kaminari には配列用のメソッドがあるらしい

user_controller.rb
@users = @q.result(distinct: true)
@users = Kaminari.paginate_array(@users.reject{|user| user == current_user}).page(params[:page]).per(6)

Kaminari.paginate_array というメソッドを使ったらいけた

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