Edited at

Railsのwhereメソッドと仲良くなろう

Railsでテーブルに対して任意の条件で検索してデータを取得する場合には高確率でwhereメソッドを使うかと思います。

私もよくお仕事でお世話になっています。

今日はそんなwhereの基礎知識をまとめてみました。


whereメソッドで何ができるか?


  • 任意のデータベースから任意の条件を指定し、条件に当てはまるレコードを すべて 取得する


    • 全て取得するので、配列として([ ]に括られて)値が返される


      • 取得したデータが1件だけであっても同じ構造





  • そのため、1件だけ欲しい場合には、末尾に.firstとかつける


    • そもそも特定の1件だけを取得したい場合にはfind_byを使った方が良い




使い方


基本的な使い方

モデル.where(条件)


条件を文字列で指定する場合

User.where("name = hoge太郎")

# SQL的にはこんな感じのが走る
# SELECT "users".* FROM "users" WHERE "users"."name" = "hoge太郎"


条件をハッシュで指定する場合

User.where(name: "hoge太郎")

# SQL的にはこんな感じのが走る
# SELECT "users".* FROM "users" WHERE "users"."name" = "hoge太郎"


条件を配列で指定する場合

# ?に対して、 ','以降の値が順に当てはめられる

User.where(["name = ? and tel = ?", "hoge太郎", "090-1111-2222"])

# SQL的にはこんな感じのが走る
# SELECT "users".* FROM "users" WHERE ("users"."name" = "hoge太郎" and "users"."tel" = "090-1111-2222")


IN句を使って指定する場合

# []の中に任意の条件を入れ込む

User.where(name: ["hoge太郎", "fuga二郎", "piyo三郎"])

# SQL的にはこんな感じのが走る
# SELECT "users".* FROM "users" WHERE "users"."name" IN ("hoge太郎", "fuga二郎", "piyo三郎")


ちなみに

whereメソッドを使うと簡単に任意の検索ができますが、裏側でどんなSQLが走っているかはログを見ないといけません。

そんな時には、to_sqlメソッドが非常に便利です。

こいつを使うとActiveRecordがよしなにやってくれる処理の裏側(どんなSQL走査が行われているか)を垣間見ることができるので、デバッグとかに使えます。

User.where(name: 'fuga二郎').to_sql

#こんなのが戻り値として返される
SELECT "users".* FROM "users" WHERE "users"."name" = 'fuga二郎'


参考

Railsドキュメント where

Rails tips: to_sqlでクエリをSQLに変換する(翻訳)