【Rails入門】where likeであいまい検索!複数条件やOR条件も解説

こんにちは!システムエンジニアのオオイシです。

今回は、Ruby on RailsでWHERE LIKE検索する方法をご存じですか!?

「Railsであいまい検索したい」

「LIKE検索で複数の条件はどうするの?」

そんな疑問や課題を解決するために、この記事では以下の内容を解説していきます。


【基礎】LIKEによるあいまい検索とは
【基礎】RailsでLIKE検索してみよう
【発展】LIKE検索のバリエーションを紹介
【発展】高度なLIKE検索方法

初心者でもわかるように解説していますので、しっかりと理解しておきましょう!

目次

LIKEによるあいまい検索とは

SQLにはLIKE句を使ったあいまい検索の構文があります。

  • 〜 WHERE 列名 LIKE ‘%検索値%‘
  • 〜 WHERE 列名 LIKE ‘検索値_‘


% → 0文字以上の任意の文字列
_  →  任意の1文字

同様のことをRailsで実現するためには、whereメソッドにSQLのLIKE句で検索条件を記述します。

モデルクラス.where("列名 LIKE ?", "%値%")  # 値(文字列)を含む
モデルクラス.where("列名 LIKE ?", "値_")   # 値(文字列)と末尾の1文字

「?」はプレースホルダと言うもので、第2引数の値を「?」へ置き換えるための目印です。

SQLインジェクションなどのセキュリティリスクを防ぐ働きもあります。

次項では、サンプルプログラムを解説していきます。

なお、SQLのWHEREやLIKEについてはこちらに詳しく解説しているので、ぜひ参考にしてみてください。

RailsでLIKE検索してみよう

Sampleモデルを作成し、LIKE検索するサンプルプログラムを紹介します。

テストデータの準備

モデルを作成します。

$ bin/rails g model Sample value:string
$ bin/rake db:migrate

テストデータを投入します。

$ bin/rails c
> Sample.all
Sample Load (2.4ms)  SELECT `samples`.* FROM `samples`
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+

なお、検索結果を一覧で確認できるようにするために、HirbというGemを使っています。

詳しくはこちらに解説があるので参考にしてみてください。

モデルについてはこちらで詳しく解説しています。

RailsでLIKE検索する

それでは、RailsでLIKEを使って”BCD”を含む文字列を検索するサンプルコードを確認してみましょう。

> Sample.where("value LIKE ?", "%BCD%")
Sample Load (0.3ms)  SELECT `samples`.* FROM `samples` WHERE (value LIKE '%BCD%')
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+
1 row in set

このようにあいまい検索することができました。

LIKE検索のバリエーションを紹介

前方一致・後方一致

%(0文字以上の任意の文字列)を活用して、様々なバリエーションで検索することができます。

  • 前方一致(から始まる):検索値%
  • 後方一致(で終わる):%検索値

サンプルコードを見てみましょう。

> Sample.where("value LIKE ?", "A%")
  Sample Load (0.3ms)  SELECT `samples`.* FROM `samples` WHERE (value LIKE 'A%')
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+
1 row in set
> Sample.where("value LIKE ?", "%E")
  Sample Load (0.6ms)  SELECT `samples`.* FROM `samples` WHERE (value LIKE '%E')
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+
1 row in set

このように、前方一致・後方一致で検索を確認することができました。

任意の1文字で一致

_(任意の1文字)を活用して、様々なバリエーションで検索することができます。

> Sample.where("value LIKE ?", "A____")
  Sample Load (0.7ms)  SELECT `samples`.* FROM `samples` WHERE (value LIKE 'A____')
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+
1 row in set
> Sample.where("value LIKE ?", "A___E")
  Sample Load (0.3ms)  SELECT `samples`.* FROM `samples` WHERE (value LIKE 'A___E')
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+

このように、_(任意の1文字)を使った、あいまい検索を確認することができました。

OR・ANDを組み合わせた複数の条件

ORやANDを使った複数の条件はこのように記述します。

  • モデルクラス.where( “列名 LIKE ? AND 列名 LIKE ? “, “条件1“, “条件2“)

1番目の「?」は第1引数に対応し、2番目の「?」は第2引数に対応している点に注目してください。

高度なLIKE検索方法

ransackとは

ransackと言うGemをご存知でしょうか。

ransackとは、非常に簡単に検索機能を追加するための有名なGemです。

今回は、ransackを使った高度なLIKE検索について解説します。

ransackのインストール

まずは、ransackをインストールします。

Gemfile:

gem 'ransack'

インストール:

$ bin/bundle install

LIKE検索する

ransackでは、< や > 、LIKE などを表現するために列名に特別な述語を追加します。

○○を含む検索は、

  • モデル名.ransack(列名_cont: “○○”).result

次のように記述します。

サンプルプログラムを確認してみましょう。

> Sample.ransack(value_cont: "ABC").result
  Sample Load (0.3ms)  SELECT `samples`.* FROM `samples` WHERE `samples`.`value` LIKE '%ABC%'
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+

その他にも、

  • 前方一致:モデル名.ransack(列名_start: “値”).result
  • 後方一致:モデル名.ransack(列名_end: “値”).result
  • SQLと同じ:モデル名.ransack(列名_matches: “%値%”).result

などが利用できます。

配列を条件にLIKE検索する

ransackを使うと配列で複数の検索条件を指定することができます。

  • AND(かつ)条件:モデル名.ransack(列名_述語_all:  [“値”,”値”…]).result
  • OR(または)条件:モデル名.ransack(列名_述語_any:  [“値”,”値”…]).result

ここでは、Aで始まりかつEで終わるサンプルコードについてみてみましょう。

>Sample.ransack(value_matches_any: ["A%","%E"]).result
  Sample Load (1.2ms)  SELECT `samples`.* FROM `samples` WHERE (`samples`.`value` LIKE 'A%' OR `samples`.`value` LIKE '%E')
+----+-------+-------------------------+-------------------------+
| id | value | created_at              | updated_at              |
+----+-------+-------------------------+-------------------------+
| 1  | ABCDE | 2018-09-05 07:25:27 UTC | 2018-09-05 07:25:27 UTC |
+----+-------+-------------------------+-------------------------+

このように配列で複数条件を指定することができました。

Railsを独学で頑張っているけど先が見えない方のために

独学でRailsを頑張っているわけだけど、先が見えない・・・

そんな方、実はいらっしゃるのではないでしょうか?

いや、おれは違うぞ。先のキャリアもしっかり見えてるし、独学の成果も出てきている

そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。

しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。

なぜ「先が見えない」という不安や悩みを抱えてしまうのか

さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRailsを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。

先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。

  • プログラミングの上達が見えない
  • プログラミングを継続できない気がする
  • プログラミングスキルを習得した姿がイメージできない
  • プログラミングスキルを活かした仕事を獲得するイメージができない

これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。

これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。

受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。

未来に光を当て、プログラミング学習を「成果が出るもの」にするために

先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。

これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。

独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。

これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。

実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。

そう言い切れるのは、以前の私もそうだったからです。

エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。

そうは言っても、周りにそういう人がいないし・・・

という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料カウンセリングを利用するのです。

営業をかけられて時間の無駄に終わるでしょ?

という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。

「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料カウンセリングがぴったりだと断言できます。それくらい無料カウンセリングに自信を持っているのです。

さらに、無料カウンセリングには以下の3大特典もついてきます!

  • 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
  • 効率的なオリジナル学習カリキュラム
  • 未経験の転職(フリーランス)を可能にするキャリアサポート

上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料カウンセリング特典です。

ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?

無料カウンセリング予約はこちら

まとめ

いかかでしたか?

今回は、RailsでWHERE LIKE検索する方法について解説しました。

Railsであいまい検索をしたい場合は検索条件をSQLに記述して実現します。

ransackで高度な検索機能を簡単に追加することもできるので、ぜひ試してみてください。

もし、Railsであいまい検索の方法について忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次