スマートに検索!Railsのwhere使い方まとめ!

どうも!
インストラクターのババです!
Railsでデータベースを扱うためのメソッドの中に「where」があります。

whereは非常によく使用するメソッドなのですが、ちょっと応用的な使い方をしようとすると、ど忘れしてググってと、時間を無駄にしてしまうことが多くあります。

ですので今回は

「そもそもwhere文ってどうやって書くの?」
「where文で配列で一括検索できなかったっけ?」
「whereで?ってでてくるけど何の意味があるの?」
「andとかorとかnotとか使いたい!」

などwhereについての悩みをお持ちの方のために、

whereの基本形
whereでの配列指定
whereでの比較
whereでのnot, or, and

についてしっかりまとめて解説していきたいと思います。

where基本形

まずはwhereの基本形です。

User.where(kind: 1)

この書き方でkindが1のユーザーを全て取得することができます。

よく似たメソッドにfindがありますが、findとの違いは条件に合う全てのレコードを取得できることにあります。

whereの書き方多すぎない?

他の解説サイトで

User.where(‘kind = 1’)
User.where(‘kind = ?’, 1)

という書き方でも解説されていますが、where内に渡したい引数が一つの場合は最初に説明したハッシュで値を渡すようにしましょう。

理由は二つあります。

一つ目は「SQLインジェクション」という悪意のある攻撃を防ぐためです。

例えば

number = 1
User.where(‘kind = number’)

という文を書いたとします。

この文のようにwhere内の条件文字列内に変数を入れてしまうとそこを変更される可能性がでてきて、そこがプログラムの弱点となってしまうことがあります。

しかしハッシュで書くと自動的に弱点をカバーしたSQL文を発行してくれます!

二つ目は「書きやすさ」の面です。これは単純ですね笑

User.where(kind: 1)

User.where(‘kind = ?’, 1)

ならUser.where(kind: 1)の方が書きやすいです。

ただ、User.where(‘kind = ?’, 1)のような書き方は後から説明する、「and」「or」検索のときや、比較演算子で検索したいときに使うので頭に留めておくようにしましょう。

以上二つの理由から
値が一つの時はハッシュで!
と覚えておきましょう!

配列で指定

whereは配列で指定することもできます。

User.where(kind: [1,2])

と指定すると、kindが1か2のユーザーを全て取得することができます。

この時も条件が一つだけならハッシュで指定するようにしましょう。

not

User.where.not(kind: 1)

kindが1以外のユーザーを全て取得することができます。

もちろん以下のように配列で渡すこともできます。

User.where.not(kind: [1, 2])

比較

これ以降先ほど見た「クエスチョンマーク(?)」を使うやり方がでてきます!

 User.where("kind > ?", 1)

これでkindが1より大きいユーザーを全て取得することができます。

これはwhereに渡す値が一つですが、ハッシュだと比較ができないのでクエスチョンマークを用いて書きます。

or

User.where(‘kind = ? or name = ?‘, 0, ‘yamada’)

これでkindが0かnameが’yamada’のユーザーをすべて取得することができます。

whereに渡す値が複数の場合は、クエスチョンマークの書き方を使用しましょう。

and

User.where(‘kind = ? and name = ?‘, 0, ‘yamada’)

これで kindが0かつ、nameが’yamada'のユーザーを全て取得することができます。

and文は下のように「メソッドチェイン」という方法でも書くことができます。

User.where(kind: 0).where(name: ‘yamada’)

メソッドチェインで書くと、複数のメソッドを使用していても一つのSQL文にまとめてくれるので条件が複雑になる場合は積極的に「メソッドチェイン」を使っていきましょう。

まとめ

今回はwhereの使い方について解説していきました。

whereで条件をうまく設定できると、スマートにRailsのコードを書くことができます。

orやandの使い方を知らないと、SQLが何度も呼び出されたりして、読み込み時間の増加につながることもあります。
しっかり覚えておくようにしましょう!

関連記事

しっかり使い分け!Railsでのfind, find_byの違い、使い方
更新日 : 2017年12月18日
LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

ババシュンスケ

ババシュンスケ

こんにちは!
今年大学を飛び出し、フリーランスエンジニアとして働いています、ババです!

エンジニアはしんどい仕事と思われていますが、実はそんなにしんどくなくて、お金ももらえて、社会のためになる素晴らしい仕事というのを伝えるために、侍で業務委託として働いています!!

フリーランスの日常やら書いているブログやってます=>http://www.babashun.net/

おすすめコンテンツ

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

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