【Rails】whereメソッドを徹底解説!

Rails

whereメソッドとは?

whereメソッドとはテーブル内の条件に一致したレコードを配列の形で取得することができるメソッドです。

whereメソッドの使い方

whereメソッドは下記のように記述します。

ruby
1
2
3
モデル名.where("条件")
# 例
User.where("name = "太郎"")

上の例だとnameカラムの中から太郎という文字が入っているレコードを全て取得します。
またwhere(カラム名: "条件")という風に書くこともできます。
下の2つの例はどちらも同じになります。

  • where("カラム名 = "条件"")
  • where(カラム名: "条件")

また下記のように書くこともできます。

ruby
1
2
モデル名.where("id > ?", 5)
# idが5以上のレコードが全て取得できる

「?」はプレースホルダーと呼ばれ、第二引数で指定した値が置き換えられます。
上の例の「5」の部分には変数が入ることが多いです。
「?」を使うときには「where(カラム名: "条件")」のような書き方はできません。

LIKE句

LIKE句は、あいまいな文字列の検索をするときに使います。
whereメソッドと一緒に使用します。

ruby
1
モデルクラス.where("カラム名 LIKE?", "検索したい文字列") 

上の「文字列の指定」には「%」と「 _ 」を文字列と組み合わせた値として記述します。
それぞれ下記の意味を持ちます。

  • % : 空白文字を含む任意の複数文字列
  • _ : 任意の1文字

これだけだとわかりづらいので例を見てみましょう。

「%」は任意の複数文字なので「あ%」と書くと「あ」以降はどんな文字も複数含むので先頭に「あ」がついた文字列は全て含まれることになります。
「%あ」と書くと末尾が「あ」で終わる全ての文字列が含まれます。
(例)あ% = ありがとうございます

「%」が複数文字に対し、「 _ 」は任意の1文字を示します。
「あ_」とすると「あ」から始まる2文字の単語になります。
「_あ」とすると「あ」で終わる2文字の単語になります。
(例)あ_ = あめ、あお など

like句は検索機能を実装したい時などに使います。

ruby
1
users = User.where("name LIKE?", "%あ%")

上の例の場合、検索したい文字列を「%あ%」と指定しました。
ここでは前後に「%」をつけたので文字列の中に「あ」が含まれればどんな文字列も当てはまることになります。
ですのでusersテーブルのnameカラムの中の「あ」が含まれるレコード全てが取得できるというわけです。

実際にアプリ内で使ってみよう

それではrailsのファイルを使って実際にwhereメソッドを使ってみましょう。
下記のコマンドを順に実行してみましょう。
①git clone -b where https://github.com/miyagit/programan_dojo.git

② cd programan_dojo

③ bundle install
→ rbenv: version ‘2.4.1’ is not installed と表示された場合は、ruby -v と実行してください。

ruby -vと実行し出てきたversion(例: 2.3.1)と出てきたら、

vim .ruby-versionとし、
ruby -vで出てきた値(例: 2.3.1)に書き換えてください。

続いてvim Gemfileとし、ruby 2.4.1と書いてある部分をruby -vで出てきた値(例: 2.3.1)に書き換えてください。

④ rails db:create && rails db:migrate && rails db:seed

環境構築が完了しました。と表示されると、
本当にrails applicationが動作するかrails sコマンドで起動しましょう。

rails sを起動し、ブラウザでlocalhost: 3000と入力して下記のような画面が出てくれば環境構築完了です!

環境構築

アプリ内でコードを書いてみよう

それでは実際にコードを書いていきましょう。

programan_dojo/app/controllers/Main_controller.rb
上記のファイルを開けてください。すると

ruby
1
2
3
4
5
6
class MainController < ApplicationController
  def top
     @title = "whereメソッドを使ってみよう"
     @users = []
  end
end

上記の用に記載されていると思います。

それを下記のように書き換えてください。

ruby
1
2
3
4
5
6
class MainController < ApplicationController
    def top
        @title = "whereメソッドを使ってみよう"
        @users = User.where("id > 2")
    end
end

whereメソッドの引数で指定する条件式に「id > 2」と指定しました。
これはidが2より大きいレコードを全て取得するという意味を表します。
実際にビューで確認してみましょう。

whereメソッド
このようにidが3以降のレコードだけ取得できたのが確認できますね。
では次に体重が50.0kg以上のユーザーのみ取得してみましょう。
体重が保存されているカラムは「weight」になります。
どういう風に書いたらよいでしょうか?

ruby
1
2
3
4
5
6
class MainController < ApplicationController
    def top
        @title = "whereメソッドを使ってみよう"
        @users = User.where("weight >= 50.0")
    end
end

そうですね、idの部分をweightに書き換え、50.0kg以上なので条件式を「weight >= 50.0」に定義してあげればよいですね。
それではビューで確認してみましょう。

weightカラムの変更
このようにしっかりと体重が50.0kg以上のユーザーだけ表示されます。

「?」を使ってみよう

では次にプレースホルダーの「?」を使った記述をしてみましょう。
マイページを開いたときに自分だけでなく自分より年上のユーザーのデータも表示させてみます。

programan_dojo/app/controllers/users_controller.rb`を開きましょう。
そして4行目に下記のコードを追記してください。

ruby
1
2
3
4
5
6
class UsersController < ApplicationController
    def show
        user = User.find(params[:id])
        @users = User.where("age >= ?", user.age) 
    end
end

「?」部分にはuser.ageが入ります。
マイページ(ユーザー自分自身の詳細ページ)での表示を仮定しているので、user.ageにはユーザー自身の年齢が入リます。
なのでこのように記述することにより自分より年上のユーザー全ての情報を自分のデータと共に表示させることができます。

では試しにアドレスバーに
http://localhost:3000/users/1
と入力してみましょう。

whereメソッド
ユーザーidが1の年齢は25歳なので自分のレコードの他に25歳以上のユーザー全てのレコードが取得できているのがわかります。
では次にアドレス末尾のユーザーidを2に変更して、ビューを表示させてみましょう。

ユーザーid変更
idが2であるprograman_fatherは登録がしてあるユーザーの中では最高齢なので、自分以外のユーザーは表示されていないことが確認できたと思います。
このように変数を使うと状況に応じた検索ができるので非常に便利です。

検索機能を実装してみよう

それでは次にwhereメソッドとLIKE句を使って検索機能を実装してみましょう。
Main_controllerを下記のように編集してください。

ruby
1
2
3
4
5
6
class MainController < ApplicationController
    def top
        @title = "whereメソッドを使ってみよう"
        @users = User.where("name LIKE?", "%sister%")
    end
end

今回は検索したい文字列に「%sister%」と定義しました。
これでnameカラムに「sister」という文字が含まれているレコードは全て取得することができます。
それではビューで確認をしてみましょう。

検索機能
このようにnameカラムに「sister」が含まれるレコード全てが取得できました。
実際に検索機能を使うときは検索フォームで投稿したキーワードがparamsに入ってこのデータを取り出すアクションに送られるので、検索したい文字列には「%#{params[:keyword]}%」みたいな記述が入ります。

皆さんも「sister」の部分を色々と変えて検索結果を確認してみてください。

まとめ

whereメソッドはテーブル内の条件に一致したレコードを配列の形で取得することができるメソッドです。
findメソッドとは異なり、複数のレコードを取得することができます。
検索機能を実装したりするときに使用します。