おーしまブログ

プログラミングやってます

<rails>タグ検索とキーワード検索を1つのフォームで行う

こんにちは、おーしまです。

今回は、タグの検索とキーワード検索を1つのフォームで行うことができたので、紹介します。

ちなみに、タグ検索は、入力したタグがついているレビューだけを表示し、キーワード検索は、入力したキーワードがタイトルか本文に含まれているレビューを表示するものです。


それではいきましょう。

コントローラー

def search
  if (params[:keyword])[0] == '#'
    @cars = Tag.search(params[:keyword]).order('created_at DESC')
  else
    @cars = Car.search(params[:keyword]).order('created_at DESC')
  end
end

carモデル

  def self.search(search)
    if search != nil
      Car.where('title LIKE(?) or text LIKE(?)' , "%#{search}%",  "%#{search}%")
    else
      Car.all
    end
  end

tagモデル

  def self.search(search)
    if search != '#'
      tag = Tag.where(name: search)
      tag[0].cars
    else
      Car.all
    end
  end

こんな感じになりました。

まず、コントローラーで「#」がついているか見極めます。
「#」が先頭についていると、タグ検索、ついていなければ、キーワード検索、としています。

それぞれのモデルにsearchメソッドを作り、引数には、「タグ名」もしくは、「キーワード」が運ばれてきます。carモデルに「キーワード」が運ばれてきた場合には、whereメソッドを用いてtitleかtextにキーワードが含まれていれば取り出します。tagモデルに「タグ名」が運ばれてきた場合も、whereメソッドでタグを探し、そのタグに紐付くレビューを取り出します。(whereメソッドを使うと、配列になるので、[0]としている)
また、空欄で送られてきた場合と、「#」のみで送られてきた場合は、全てのレビューを表示するようになっています。
簡単ですね。


その他に、レビューの詳細画面に表記してあるタグをクリックして、そのタグの一覧表示に飛ばすには、表記してあるタグ名で検索をすれば良いということになります。つまり、、、
f:id:tomo_bb_aki0118115:20201102225056p:plain

この部分を、、、

<%=link_to tag.name, search_cars_path(keyword: tag.name) %>

と、してあげます。
(keyword: tag.name)でパラメーターのkeywordに「タグの名前」が入ってリクエストを送ることができるため、タグ名で検索したのと同じことになります。


今回は以上です。
それでは、また〜

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}