railsを始めてみたけどwhereってどう使う?
オブジェクトを検索したい時はどうすればいい?
こんなお悩みに答えます。
記事の信頼性
当サイトの管理者「つげお」は、プログラミング未経験からWeb業界でプログラマー(Ruby on Rails)として6年勤務しています。
Ruby on Railsでは、ActiveRecordという機能によってDB(データベース)内のデータを検索することができます。
ただ、Railsには似たようなメソッドが多いため、「何が違うのか」「どれを使えばいいのか」分かりづらいですよね。
そこで、本記事では、Railsのwhereメソッドについて使い方を解説しています。
whereの使い方
whereメソッドは、指定したカラムの値に合致するデータを検索するメソッドです。
以下、Userモデルを例に説明していきます。
whereの基本形
whereメソッドの基本形は「モデル名.where(カラム名: 値)」となります。
検索したいモデルにwhereを繋げて使います。whereの引数(カッコの中の部分)には、検索したいカラムと値を指定しましょう。
User.where(age: 20)
上記は「Userテーブルの中でageが20のレコードを検索」という意味になります。
※複数ヒットすれば複数のレコードを返します
複数のデータが帰ってきた場合の並び順は決まっておりませんので、orderをかけてあげるのが良いです。
なお、ヒットするidのレコードが見つからない場合は、ActiveRecord_Relationクラスの空配列を返します。
条件の複数指定(AND検索)
whereの引数には、複数の条件を指定することができます。
User.where(age: 20, sex: 'male', payment: true)
上記は「Userテーブルの中でageが20かつsexがmaleかつpaymentがtrueのレコードを検索」という意味になります。
LIKEであいまい検索
Stringのカラムを指定する場合、指定した文字列を含むレコードを検索することができます。
User.where('email like ?', '%@gmail.com%')
上記は「Userテーブルの中でemailに@gmail.comが含まれるレコードを検索」という意味になります。
ORでいずれかを含む検索
whereの後に.orをつけることで、条件1または条件2に該当のような検索ができます。
※Rails5からの機能です
User.where(family_name: '山田').or(User.where(first_name: '太郎'))
上記は「Userテーブルの中でfamily_nameが山田またはfirst_nameが太郎のレコードを検索」という意味になります。
NOTで否定検索
whereの後に.notをつけることで、条件に当てはまらないレコードを返すようになります。
User.where.not(status: 'reject')
上記は「Userテーブルの中でstatusがreject以外のレコードを検索」という意味になります。
whereの使い方まとめ
whereソッドはデータベースからレコードを検索する機能です。
whereには下記のような検索方法があります。
- 基本の条件指定【モデル.where(カラム名: 値)】
- AND検索【モデル.where(カラム名1: 値1, カラム名2: 値2)】
- あいまい検索【モデル.where('カラム名 like ?', %値%)】
- 否定検索【モデル.where.not(カラム名: 値)】
whereはレコードを複数返しますが、その順序はランダムなので、思わぬ動作不良を起こすことがよくあります。
whereを使う際は、orderメソッドでしっかり整列してあげましょうね。
whereはRailsアプリに必須の機能です。使い方をマスターしましょう!
whereと同様にレコードを検索する「findメソッド」「find_byメソッド」はこちらの記事にまとめています。
[blogcard url="https://programming.tsugelog.com/rails-find/"]