スライドショー

【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入門】初心者が知っておくべき3つのgem
更新日 : 2019年8月9日

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

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を組み合わせた複数の条件

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

  • モデルクラス.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であいまい検索の方法について忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

オオイシ

オオイシ

システムエンジニア歴15年のオオイシです!好物は Java と Ruby。プログラミング、システムアーキテクトからマネジメントに到るまでなんでも食べます。
システム開発の相談やお困りごとがあればお気軽に
[email protected] まで連絡頂けると幸いです

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説