whereメソッドで簡単な検索機能を実装

こんにちは!kossyです!




本日の気になったニュースはこちら
https://headlines.yahoo.co.jp/hl?a=20181024-00000019-mai-sociheadlines.yahoo.co.jp

地方での取組みですが、ここで成功すれば全国に広がるのではないでしょうか。

この取組みで集めたデータを別の事業活動に役立てたいですね。
とは言ってみたものの特に思いつかない頭の硬さ、、、笑
実際に現場に出て活動してみないとわからないことも多そうです。





さて、今回はransackを使わずに、whereメソッドで簡単な検索機能を実装するやり方を
ブログに残してみたいと思います。




アプリ概要
よくある本のレビューサイトのようなものをサンプルとして扱います。
モデル名はReview、Userとしておきます。





ルーティング設定>

prefixを使いたいため、collectionオプションを使ってルーティング定義をしています。
collectionオプションについては
www.rubylife.jp

こちらの記事が詳しかったです。

config/routes.rb

  resources :reviews do
    collection do
      get 'search'
    end
  end



コントローラ実装

ルーティングでsearchというアクションを指定しているので、searchアクションを作成します。

app/controllers/reviews_controller.rb

class ReviewsController < ApplicationController

省略

  def search
    @results = Review.where('language LIKE ?', "%#{params[:language]}%").order(created_at: 'DESC')
  end

省略

end

上記のアクションを説明すると、whereメソッドの中で検索したいカラム名languageを指定し、
メタ文字である?で動的なパラメータに対応できるようにします。
params[:language]で検索したいキーワードを受け取り、
該当するレコードをorderメソッドで作成日順に並び替えて取り出しています。





検索画面
検索結果を部分テンプレート化しています。(hamlで記述しています)

search.html.haml

= form_tag('/reviews/search', method: :get) do
  = select_tag :language, options_for_select([["",""], ["HTML&CSS","HTML&CSS"], ["Sass","Sass"], ["Javascript","Javascript"], ["React","React"], ["Vue.js","Vue.js"], ["python","python"], ["Ruby","Ruby"], ["Java","Java"], ["Golang","Golang"], ["Swift","Swift"], ["Kotlin","Kotlin"], ["Ruby on Rails","Ruby on Rails"], ["Django","Django"], ["Laravel","Laravel"], ["playframework","playframework"], ["SQL","SQL"]], params[:language]), {}
  = submit_tag '検索'
 = render "result"



_result.html.haml

%table.table.table-hover.boards__table
  %thead.thead-dark
    %tr
      %th タイトル
      %th 作成者
      %th レベル
      %th 言語
      %th 作成日時
  %tbody
    - @results.each do |result|
      %tr
        %th= link_to "#{result.bookname}", result
        %th= result.user.name
        %th= result.level
        %th= result.language
        %th= result.created_at.to_s(:datetime)

モデルに紐付いたレコードを作成するわけではないので、
form_tagを使っています。
form_forとform_tagの使い分けは以下の記事が詳しかったです。
qiita.com

検索窓はセレクトボックスを生成するビューヘルパーである、
select_tagを使って実装しています。

検索結果のユーザー名はアソシエーションで記述しています。
詳しく知りたい方は
https://qiita.com/To_BB/items/47d2c7b1bc3513025d7bqiita.com
こちらの記事を参考にしてみてください。

検索結果の見た目はbootstrapで整えています。





サンプル動作
こんな動作になると思います。
f:id:kossy-web-engineer:20181024174551g:plain