🙄

検索機能の実装

2021/01/17に公開

searchアクションのルーティングを設定
collectionとmember
collectionとmemberは、ルーティングを設定する際に使用できる。これを使用すると、生成されるルーティングのURLと実行されるコントローラーを任意にカスタムできる。collectionはルーティングに:idがつかない、memberは:idがつくという違いがあります。

collection do
  get 'search'
end
Prefix           Verb    URI                                 Pattern
search_tweets    GET    /tweets/search(.:format)              tweets#search
member do
  get 'search'
end
Prefix           Verb    URI                                 Pattern
search_tweet      GET    /tweets/:id/search(.:format)       tweets#search

検索のメソッドをモデルに定義
ビジネスロジックとは、データに対する処理などを行うプログラム処理のこと。具体的には、「データをどのように処理するのか」「どのデータを取得するのか」「どのような手順で処理をしていくのか」などを指す。
検索したキーワードが含まれている投稿を取得するために、whereメソッドとLIKE句を利用する。

whereメソッド
モデルが使用できる、ActiveRecordメソッドの1つ。モデル.where(条件)のように、引数部分に条件を指定することで、テーブル内の「条件に一致したレコードのインスタンス」を配列の形で取得できる。
条件式には'カラム名 > 5'やキーバリューの形でカラム名: 値などの記述が可能。条件と一致する値を持つレコードを、すべて取得する。また、whereメソッドを連続して記述することによって、複数の条件に一致したレコードを取得することもできる。

LIKE句
LIKE句は、曖昧な文字列の検索をするときに使用するもので、whereメソッドと一緒に使う。曖昧な文字列の検索とは、たとえば「1文字目に'a'という文字列が入ったデータ」や「最後の文字に'b'が入っているデータ」、「文字列の途中に'c'が入ったデータ」などを検索するもの。

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

引数のsearchは、検索フォームから送信されたパラメーターが入るため、if search != ""と記述し、検索フォームに何か値が入力されていた場合を条件とする。もし検索フォームに何も入力をせずに検索ボタンを押すと、引数で渡されるsearchの中身は空になる。この場合はelseに該当し、Tweet.allという記述は、そのときすべての投稿を取得して表示するためのもの。

※実際の開発現場でも、テーブルとのやりとりに関するメソッドはモデルに置くという意識が必要。
 コントローラーはあくまでモデルの機能を利用し処理を呼ぶだけで、複雑な処理は組まない。

searchアクションをコントローラーに定義

def search
  @tweets = Tweet.search(params[:keyword])
end

searchメソッドの引数にparams[:keyword]と記述して、検索結果を渡している。

検索結果画面のビューを作成

Discussion