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