Yuki's Tech Blog

仕事で得た知見や勉強した技術を書きます。

【Rails】前方一致検索機能を実装してみた

目次

背景

仕事でユーザーが入力した文字列から検索候補を表示する機能を実装して、その際に前方一致検索のAPIを実装したので、忘れないように記事にします。

どうやって前方一致検索を実装するのか

whereメソッド、LIKE句、プレースホルダー、ワイルドカードの4つを使用して実装します。

whereメソッドの2つの引数の指定方法について

whereメソッドの引数の指定方法は2つあります。

1. シンボル指定

User.where(name: "yuki")

2. 文字列指定

User.where("name = 'yuki'")

文字列指定ではプレースホルダーを使用できます。?(プレースホルダー)が第二引数で指定した値に置き換えられます。

# ?の部分はプレースホルダーと呼ばれる。
User.where("name = ?", "yuki")

# 上のコードは下記のコードと同じ
モデル名.where("name = 'yuki'")
モデル名.where(name: "yuki")

ワイルドカードについて

ワイルドカードとは、任意の文字列を指定するときに使う「%」や「_」などの特殊文字のことです。SQLのLIKE句で主に使用します。

ワイルドカード 意味
% 0文字以上の任意の文字列
_ 任意の1文字

具体的な実装

LIKE句を使用することで、あいまいな文字列を検索できます。以下ではwhereメソッドに文字列で引数を指定しています。 第二引数には「ユーザーが入力した名前 + 0文字以上の任意の文字列」を指定しているので、?が置き換えられます。%は0文字以上の任意の文字列なので、結果的に、名前で前方一致検索ができます。前方一致検索があることで、ユーザーが名前を全部入力しなくても名前を検索でき、ユーザー体験が向上します。

# モデルクラス.where("カラム名 LIKE ?", "検索したい文字列")であいまいな文字列で検索できる
def serach
  users = params[:name].present? ? User.where("name LIKE ?", "#{params[:name]}%") : []
  render json: Response::Success.new(data: { users: }), status: :ok
end

(注) 名前だけ返すと、そのユーザーの情報を再度取得する必要があり、使いにくいAPIになってしまいます。そのため、返してはいけないデータだけシリアライズして除き、基本的にはユーザー情報全部を返します。

参考記事

【Rails】 whereメソッドを使って欲しいデータの取得をしよう! | Pikawaka

【SQL】LIKE句とは何か?具体的な使い方を解説!