どうも!
インストラクターのババです!
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が何度も呼び出されたりして、読み込み時間の増加につながることもあります。
しっかり覚えておくようにしましょう!