1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】検索キーワードを空白で2つに分ける

Posted at

はじめに

Itemモデルを検索する想定で中身は下記とする。

id name
1 test
2 sample
3 test sample

やりたい事

検索フォームにて空白(スペース)を含むキーワードが入力された場合、
空白を境に文字を分けそれぞれのキーワードで検索を行い結果を返したい。

items_controller.rb
    # 例えば下のキーワードで検索された場合
    @keyword = "test sample"
    # そのまま検索しようとすると
    @items = Item.where("name LIKE ?", "%#{@keyword}%")
    # 結果は"test sample"という文字列を含んだid:3のItemのみが返ってくる
    @items.ids => [3]

今回は「test sample」のキーワードで検索された際に、
Itemモデルのデータ全てを返せる事をゴールとする。

1.検索キーワードを空白で分ける

まずはキーワードの内の空白を検知して分割する為にsplitメソッドを使う。

splitの使い方
    "対象の文字列".split("区切りにする文字","分割する回数")
    # 分割する回数は省略可、省略した場合は区切りにする文字全ての箇所で分割する。
    # またsplitは配列の形でデータを返すので注意

実際に使用して書き換える。

items_controller.rb
    @keyword = "test sample"
    @keywords = @keyword.split(/[[:blank:]]+/)

ここで区切りにする文字として指定した正規表現の内容は、
[[:blank:]] → 空白演算子、半角・全角両方の空白を対象にする為。
+ → 空白が連続して入力された場合でも対応できるようにする為。

2.分割したキーワード毎に検索を行う

items_controller.rb
    # 分割したキーワード毎に検索を行いインスタンスにセット
    @keywords.each do |keyword|
      @items = Item.where("name LIKE ?", "%#{keyword}%")
    end

splitは配列でデータを返すのでeachメソッドで中身全てを取り出す。

3.結果

items_controller.rb
    @keyword = "test sample"
    @keywords = @keyword.split(/[[:blank:]]+/)
    @keywords.each do |keyword|
      @items = Item.where("name LIKE ?", "%#{keyword}%")
    end
    @items = @items.order("id ASC")
    @items.ids => [1, 2, 3]

4.最後に

検索の機能でまず実装しようと思ったのがこれだったので備忘録として。
他にも色々必要な機能があると思うので考えていきたいと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?