Railsにおいてデータベースからデータを取得するにはActive Recordを使用します。
その際findメソッドとwhereメソッドがよく使用されます。
この2つのメソッドの違いを深く理解するのが重要です。
本記事ではfindメソッドとwhereメソッドの違いについて初心者にも分かりやすく解説していきます。
Railsにおけるfindとwhereの違い
まずは、findとwhereの定義と用途について解説します。
findとwhereの用途
findメソッドは主キーを指定して1件のレコードを取得するメソッドです。
主キーとは各レコードを一意に特定するためのカラムです。Railsでは通常はidカラムです。
一方、whereメソッドは条件を指定して複数件のレコードを取得するメソッドです。 whereを使用するとfindメソッドで行うより複雑な検索ができます。
findとwhereの違い
findメソッドとwhereメソッドは、「引数」と「戻り値」の点での違います。
findメソッドの引数と戻り値は以下の通りです。
- 引数: 取得したいレコードの id
- 戻り値: 引数で指定した id を持つレコードが作成したモデルのインスタンス(1レコード)
whereメソッドの引数と戻り値は以下の通りです。
- 引数: 取得したいレコードを特定する条件(SQLのwhere節に相当する値)
- 戻り値: 引数で指定した条件を満たすレコードから作成したモデルのインスタンス(複数レコード)
findは主キーを指定するため単一のレコードを取得する場合に使用します。
(主キーは全てのレコードで異なる値であることが保証されているので、主キーを指定すれば自ずと1件だけが該当します)
一方、whereは条件を指定するため、条件を満たす複数のレコードを取得する場合に使用します。
正確には find メソッドは複数の id を指定すると複数レコードを返します。
例えば User.find([1, 2]) とすれば id が 1 と 2 のレコードを取得し長さ2の配列として返します。
User.find([1, 2])
=> [#<User id: 1 …>, #<User id: 2 …>]
使い分けの例
findメソッドは主キーを指定する場合に使用するので、1件のレコードを取得する際に便利です。例えば、idが1のレコードを取得する場合は以下のようになります。
User.find(1)
whereメソッドは条件を指定してレコードを取得する場合に使用します。 例えば、年齢が20歳以上のユーザーを取得する場合は以下のようになります。
User.where('age >= ?', 20)
findとwhereで実行されるSQLの違い
findメソッドとwhereメソッドの違いは実行されるSQLにも現れます。
findメソッドは主キーを指定するため以下のようにコードになります。
User.find(1)
上記のコードは以下のクエリに変換されます。
SELECT * FROM users WHERE id = 1 LIMIT 1;
findメソッドは引数にidを指定するため where id = 1
となります。 さらにfindメソッドの実行結果は1件のレコードとなるため LIMIT 1 が付加されています。
次に、whereメソッドを使用した実行例です。
User.where('age >= ?', 20)
上記のコードは、以下のクエリに変換されます。
SELECT * FROM users WHERE age >= 20;
where メソッドは条件説をそのまま指定するような形式となり、引数がそのまま変換されてwhere age >= 20
となります。
development モードで実行していると logs/development.log に残されているログに上記のようなSQLが記録されています。 どのような実行をしたらどのようなSQLを発行されるのかを整理すると格段に上達しますのでぜひ確認してみてください。
まとめ
本記事では、Railsにおけるfindとwhereの違いを徹底解説しました。
- findメソッドは主キーを指定して単一のレコードを取得する
- whereメソッドは条件を指定して複数のレコードを取得する
どのようなSQLが発行されるのかを意識すると正しく使い分けできます。
正しくfindとwhereを使い分けてデータベースからデータを取得しましょう。