はじめに
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.最後に
検索の機能でまず実装しようと思ったのがこれだったので備忘録として。
他にも色々必要な機能があると思うので考えていきたいと思います。