6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2021年9月3日 現場Rails Chapter7 7-2一覧画面に検索機能を追加する

7-2-1 Ransackのインストール

Ransackとは?

検索機能を作成できるGemのことです。簡単な検索や複雑な検索のフォームを簡単に作成することができます。Gemfile内に以下のように記述します。

gem 'ransack'

ターミナルでbundle installを実行してインストールします。 インストール後にRailsサーバが起動したままの場合、サーバーを止めてrails s を再度実行しておきます。

7-2-2 名称による検索

  def index
    @q = current_user.tasks.ransack(params:q)
    @tasks = @q.result(distinct: true).recent
  end
  
  # tasksの中の検索キーワードに当てはまるパラメータをransackメソッドでテーブルからデータを検索します。
  # distinctで検索結果の重複を防いで@tasksに格納しています。
  # recentは現場Rails(p.178)でscopeで定義されているクエリメソッドで、検索結果を作成した日時を降順に並び替えます。

用語解説(出典:Pikawakaより)

params[:q]: この後に作成するビューファイルから送られてくるパラメーターです。 ransackメソッド: 送られてきたパラメーターを元にテーブルからデータを検索するメソッドです。 resultメソッド: ransackメソッドで取得したデータをActiveRecord_Relationのオブジェクトに変換するメソッドです。

Ransackを使わずに検索機能を実装する場合

Task.where("name like ? and user_id = ?", '%#{params[:search]}%', 
current_user.id).distinct.order(created_at: "DESC")

パラメーターの値はinputタグのname属性で自分で指定してあげることでcontroller側で取得できます。

distinctメソッド = ユニーク検索

特定のフィールドについて、重複のない一意の値を1レコードだけ取り出したい場合、distinctを使用します。 また、distinctには引数を設定することができ、falseにすると、重複の有無を問わずすべてのフィールドを取得できます。しかし、一般的にはselectを使う方法をオススメします。

# モデル名.select(:取得列).distinct([重複を削除するかをtrueかfalseで指定])

query = Client.select(:name).distinct
# => 重複のない一意の名前が返される。

query.distinct(false)
# => 重複の有無を問わずすべての名前が返される。
# 一度distinctを使って重複データを除外した後に、もう一度重複データを取得したいときに使う?(推測)

参照

GitHub - activerecord-hackery/ransack

https://github.com/activerecord-hackery/ransack

Pikawaka - whereメソッド

https://pikawaka.com/rails/where

Rails】 distinctメソッドでユニークなデータを取得する方法 https://pikawaka.com/rails/distinct